JEP 430:字符串模板(预览)


模板表达式STR是 Java 编程语言中的一种新型表达式,STR也是一个在Java库中定义的模板处理器。

STR是将模板中的每个嵌入式表达式替换为该表达式值。

模板表达式STR也可以通过编程方式帮助开发人员安全高效地编写字符串。

此外,模板表达式不限于组成字符串,它可以根据特定领域的规则将结构化文本转换为任何类型的对象。

STR是一个公共的静态最终字段,在每个Java源文件中都会自动导入。

从句法上讲,STR类似于带有前缀的字符串文字。这段代码的第二行有一个模板表达式:

String name = "Joan";
String info = STR.
"My name is \{name}";
assert info.equals(
"My name is Joan");   // true

模板表达式STR."My name is \{name}"包括:

  1. 模板处理器( ) STR;
  2. 点字符 (U+002E),如在其他类型的表达式中所见;和
  3. 包含嵌入表达式( )的模板( ) :"My name is {name}"{name}

在运行时评估模板表达式时,其模板处理器将模板中的文字文本与嵌入表达式的值组合起来以产生结果。

下面是使用STR模板处理器的模板表达式的复杂例子:

String firstName = "Bill";
String lastName  =
"Duck";
String fullName  = STR.
"\{firstName} \{lastName}";
|
"Bill Duck"
String sortName  = STR.
"\{lastName}, \{firstName}";
|
"Duck, Bill"

// Embedded expressions can perform arithmetic
int x = 10, y = 20;
String s = STR.
"\{x} + \{y} = \{x + y}";
|
"10 + 20 = 30"

// Embedded expressions can invoke methods and access fields
String s = STR.
"You have a \{getOfferType()} waiting for you!";
|
"You have a gift waiting for you!"
String t = STR.
"Access at \{req.date} \{req.time} from \{req.ipAddress}";
|
"Access at 2022-03-25 15:34 from 8.8.8.8"

好处:
以前,不安全的、容易受到注入攻击的代码:

String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'";

现在我们可以编写更安全、更易读的代码

ResultSet rs = DB."SELECT * FROM Person p WHERE p.last_name = \{name}";

更多点击标题。