计划在Java 13中发布文本块。这是在
JEP 355中宣布的。
文本块是多行字符串文字,它消除了转义大多数特殊字符的需要,并自动进行换行。
这是从JEP 326开始的进一步研究尝试(未处理的字符串文字被召回)。

355个进球
- 通过避免转义序列来简化编写Java代码的过程。
- 提高代码的可读性。
JEP 355绝对不是要实现的目标
- 这不是尝试定义新的引用类型,例如
java.lang.String
。 - 这不是尝试覆盖字符串运算符“ +”。
- 文本块不支持行插值。 可以在后续的JEP中添加此功能。
动机
在Java中用于嵌入XML,HTML,JSON等。 通常需要使用字符串的屏蔽和串联来进行大量编辑。 片段通常难以阅读且难以维护。
因此,新的JEP既提高了可读性,又增加了编写多种Java程序的能力-使用由几条“行”组成的行,并且没有任何视觉混乱。 字符。 实际上,这是一个二维文本块,而不是一维字符序列。
语法和说明
线段左右分别用
"""
和
"""
框起来。 块的内容以
"""
之后的第一个字符开始,以
"""
之前的最后一个字符结束。 选择三引号可以清楚地看到它们是文本行,但是您可以将它们与常规字符串文字(
"..."
)区分开。
块可以直接包含引号(
"
),而不包含斜杠(
\
)。您也可以使用
\"
,但是不建议这样做。
换行是自动完成的。 允许使用\ n,但不建议使用。
""" line 1 line 2 line 3 """
类似地
"line 1\nline 2\nline 3\n"
或
"line 1\n" + "line 2\n" + "line 3\n"
这是一个空白文本块的示例:
String empty = """ """;
这是使用文本块的错误做法:
String a = """"""; String b = """ """; String c = """ "; String d = """ abc \ def """;
文本块中的转义序列
转义序列被解释。 这意味着开发人员可以在模块内编写转义序列,例如
\n
。
例子
的HTML
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
旧方法 String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n";
的SQL
String query = """ SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; """;
旧方法 String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" + "WHERE `CITY` = 'INDIANAPOLIS'\n" + "ORDER BY `EMP_ID`, `LAST_NAME`;\n";
剧本
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(""" function hello() { print('"Hello, world"'); } hello(); """);
旧方法 ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval("function hello() {\n" + " print('\"Hello, world\"');\n" + "}\n" + "\n" + "hello();\n");