当今的 Java 字符串模板

JEP 430 字符串插值

JDK 21 的一大功能是JEP 430,它是字符串插值语言的更改。它将允许编写如下代码:

String name = "Joan";
String info = STR."My name is \{name}";

在这种情况下,info将具有值“My name is Joan”。这只是此 JSR 中的冰山一角,因为整个架构都是可插拔的。我将在以后的视频中讨论这个问题,但就目前而言,我们在这里看到的基本功能非常出色。

不幸的是,在生产中使用它需要数年时间。它将在 JDK 21 中预览,然后将获得批准。我们将等待 LTS,然后等待 LTS 达到临界质量。与此同时,我们今天可以使用像这样好的东西吗?

Maven 依赖项

字符串模板没有依赖性。我们仍然需要对 pom 文件进行更改,但不需要添加依赖项。我在这里为我们即将讨论的高级模板添加一个依赖项。所需要的只是编译器插件。这意味着字符串模板是编译时功能,不会对运行时产生影响!

<dependencies>
   <dependency>
       <groupId>systems.manifold</groupId>
       <artifactId>manifold-templates-rt</artifactId>
       <version>${manifold.version}</version>
   </dependency>
</dependencies>

<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.0</version>
           <configuration>
               <source>19</source>
               <target>19</target>
               <encoding>UTF-8</encoding>
               <compilerArgs>
                   <!-- Configure manifold plugin -->
                   <arg>-Xplugin:Manifold</arg>
               </compilerArgs>

               <!-- Add the processor path for the plugin -->
               <annotationProcessorPaths>
                   <path>
                       <groupId>systems.manifold</groupId>
                       <artifactId>manifold-strings</artifactId>
                       <version>${manifold.version}</version>
                   </path>
                   <path>
                       <groupId>systems.manifold</groupId>
                       <artifactId>manifold-templates</artifactId>
                       <version>${manifold.version}</version>
                   </path>
               </annotationProcessorPaths>
           </configuration>
       </plugin>
   </plugins>
</build>

流形字符串插值

首先,我们可以创建一个新变量,用于获取外部输入。在第二行中,我们将该变量集成到打印输出中:

String world = args.length > 0 ? args[0] : "world";
System.out.println("Hello $world! I can write \$world as the variable...");

反斜杠语法隐式禁用模板行为,就像 Java 中的其他字符串元素一样。这将打印“Hello world! I can write $world as the variable…”.

有些东西你在代码中看不到,你需要看相同代码的截图:

很微妙,你看到了吗?

注意$world表情,它的颜色不同。它不再只是一个字符串,而是嵌入字符串中的变量。这意味着我们可以按住 Control 键单击它并转到变量声明、重命名它或查看其用法。

还有另一种方法可以转义字符串,我们可以@DisableStringLiteralTemplates在方法或类上使用注释来在相应的代码块中禁用此功能。如果我们在代码块中频繁使用美元符号,这会很有用:

@DisableStringLiteralTemplates
private static void noTemplate(String word) {
   System.out.println("Hello $world!");
}

模板

Manifold 项目使我们能够创建类似 JSP 的模板,而无需任何负担。我们可以为模板定义一个基类,以便为模板创建通用代码,并将通用功能放在一个位置。我们可以在 resources/templates 目录中创建一个名为 HelloTemplate.html.mtl 的文件,其中包含以下内容。请注意,我们在模板文件中定义的参数可以是任何内容:

<%@ params(String title, String body) %>
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>${title}</title>
</head>
<body>
   ${body}
</body>
</html>

对于我们这些有 JSP 背景的人来说,这似乎非常熟悉。然后我们可以像这样在 Java 代码中使用该文件,我们可以传递参数,它们将替换 HTML 文件中的相应块:

System.out.println(HelloTemplate.render("My Title", "My Body"));

请注意生成的模板,它编译为类,类似于 JSP。与 JSP 不同,该模板不是 servlet,可以在任何上下文中使用。本地应用程序、服务器等。模板语言更加轻量级,不依赖于各种服务器 API。它也不太成熟。主要价值在于使用这样的 API 生成任意文件,例如 Java 源文件或配置文件。

模板功能强大而简单。就像我们在 JSP 中一样,我们可以将 Java 源代码嵌入到模板中,例如我们可以像在 JSP 中一样包含控制流和类似的限制:

<% if(body != null) {%>

   ${body}

<% } %>

为什么不:JSP、Velocity、Thymeleaf 或 Freemarker?

Java 中已经有很多模板语言了……添加另一种模板语言似乎是一个繁重的复制负担。我认为所有这些都很棒,但这并不意味着要取代它们,至少现在还不是。

他们的重点主要是 Web 生成,它们可能不适合更流畅的用例,例如代码生成或 Spark 等 Web 框架。

另一大优势是尺寸和性能。所有这些框架都有许多依赖项和大量运行时开销。即使 JSP 默认情况下也会在运行时执行初始编译。这种模板支持是以一种很好的方式编译和 Spartan 的。它快速、简单并且深度集成到应用程序流程中。

进口

我们可以像在每个 Java 类中一样使用如下代码导入 Java 包:

<%@ import com.debugagent.stringtemplates.* %>

导入后,我们可以在代码中使用任何类。请注意,此导入语句必须位于代码中其他行的上方,就像常规导入语句一样。

包括

我们可以使用 include 将另一个模板简单地包含到当前模板中,从而允许我们组装复杂的模板,例如页眉和页脚。如果我们想要生成一个复杂的 Java 类,我们可以将样板包装在通用模板中并将其包含在其中。我们可以使用 if 语句有条件地包含模板,并使用 for 循环来包含多个条目:

<%@ include JavaCode("ClassName", classBody) %>

请注意,我们可以包含一个带有参数的条目,并将它们传递到底层模板。我们可以沿着包含链传递硬编码的字符串或变量。

多很多

由于文档问题,我跳过了扩展,该问题现已修复。它有很大的潜力。布局功能具有很大的潜力,但目前缺少参数传递。但主要价值在于简单性和完全集成。

当我定义对类的依赖关系并将其从代码中删除时,即使在模板文件中也会出现错误。这在 Thymeleaf 中不会发生。

最后一句话

总之,通过 Manifold 项目,我们现在就可以编写流畅的文本处理代码,而无需等待未来的 JVM 增强。字符串模板的引入可以帮助 Java 开发人员生成不是 Web 应用程序的文件,这在多种情况下非常有用,例如需要生成代码的情况。

Manifold 允许我们创建类似 JSP 的模板,而无需任何负担,并生成我们想要的任意文件。随着布局等复杂选项的加入,一切皆有可能。

Manifold 还有很多东西,我们将在前进的过程中更深入地研究它。

关注我的博客,您将在其中获得提示、技巧和挑战,以保持您的技能敏锐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值