JEP 430: 字符串模板(预览版)
JEP 430,即字符串模板(预览版),已从Proposed to Target状态提升为Targeted状态,计划在JDK 21中引入。该功能旨在增强Java编程语言,引入类似于字符串字面量的字符串模板,但可以在运行时嵌入表达式。
主要观点
字符串模板的作用:
- 字符串模板允许开发者在字符串字面量和文本块中嵌入表达式,从而生成特定结果。
- 目标是简化Java程序的编写,提高混合文本和表达式的可读性,并增强从用户提供的值组合字符串时的安全性。
模板表达式:
- 引入了一种新的表达式类型,称为模板表达式,允许开发者安全高效地进行字符串插值和组合。
- 模板表达式是可编程的,不仅限于组合字符串,还可以根据特定领域规则将结构化文本转换为任何类型的对象。
模板处理器:
- 模板处理器(如STR、FMT或RAW)在运行时将模板中的字面文本与嵌入表达式的值结合起来生成结果。
- 这种设计防止了直接从带有嵌入表达式的字符串字面量或文本块生成插值字符串,从而避免了危险字符串的传播。
关键信息
语法示例:
String name = "Joan"; String info = STR."My name is \{name}"; assert info.equals("My name is Joan"); // true多行文本示例:
HTML文本:
String title = "My Web Page"; String text = "Hello, world"; String html = STR.""" <html> <head> <title>\{title}</title> </head> <body> <p>\{text}</p> </body> </html> """;JSON文本:
String name = "Joan Smith"; String phone = "555-123-4567"; String address = "1 Maple Drive, Anytown"; String json = STR.""" { "name": "\{name}", "phone": "\{phone}", "address": "\{address}" } """;区域表单:
record Rectangle(String name, double width, double height) { double area() { return width * height; } } Rectangle[] zone = new Rectangle[] { new Rectangle("Alfa", 17.8, 31.4), new Rectangle("Bravo", 9.6, 12.4), new Rectangle("Charlie", 7.1, 11.23), }; String form = FMT.""" Description Width Height Area %-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()} %-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()} %-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()} \{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()} """;
模板处理器:
- STR:将模板中的每个嵌入表达式替换为其(字符串化的)值。
- FMT:解释出现在嵌入表达式左侧的格式说明符,格式说明符与
java.util.Formatter中定义的相同。 - RAW:返回未经处理的原始模板,不进行任何插值或处理。
自定义模板处理器:
- 开发者可以创建自己的模板处理器,用于模板表达式中。
- 模板处理器是一个提供
ValidatingProcessor功能接口的对象,其类实现ValidatingProcessor的单一抽象方法,该方法接受一个StringTemplate并返回一个对象。 - 模板处理器可以在运行时进行验证,并返回任何类型的对象,而不仅仅是字符串。
结论
Java中的模板表达式使开发者能够轻松安全地进行字符串插值和组合,提高了代码的可读性和安全性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。