java 字符串文字筛选






我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API(例如集合)的想法很难打破。 是。

我不明白为什么Java 仍然没有多行字符串文字。

您多久编写一次这样的JDBC代码(或您想要嵌入到Java中的任何其他外部语言或标记,例如JSON或XML)?

try (PreparedStatement s = connection.prepareStatement(
    "SELECT * "
  + "FROM my_table "
  + "WHERE a = b "
)) {
    ...
}

怎么了

  • 语法正确性 ,即不要忘记在每行的末尾添加空格
  • 宿主语言的样式与外部语言的样式 ,请确保上面的代码看起来用Java格式看起来“不错”,但对于使用方服务器端则没有格式化
  • SQL注入 ,我们不是教导我们的下辈不要在SQL中执行这种字符串连接以防止SQL注入吗? 当然,以上内容仍然是安全的,但是是什么原因使经验不足的维护者无法嵌入用户输入呢?

今天,我正在使用Xtend编写一些代码, Xtend是一种非常有趣的语言,可以编译成Java源代码。 Xtend对模板非常有用。 我注意到多行字符串的另一个非常好的功能:

无需逃脱!

Xtend中的多行字符串以三撇号终止。 例如

// Xtend
val regex = '''import java\.lang\.AutoCloseable;'''

是的,以上是有效的Java正则表达式。 匹配AutoCloseable类型的导入时,我在转义点。 我不必在普通字符串中执行繁琐的两次转义操作,就可以告诉Java编译器反斜杠实际上是反斜杠,而不是Java转换了以下字符:

// Java
String regex = "import java\\.lang\\.AutoCloseable;";

所以……转换为我们最初SQL示例,我真的很想写这个:

try (PreparedStatement s = connection.prepareStatement(
    '''SELECT *
       FROM my_table
       WHERE a = b'''
)) {
    ...
}

具有很大的优势:字符串插值(甚至PHP都有)!

String tableName = "my_table";
int b = 1;
try (PreparedStatement s = connection.prepareStatement(
    '''SELECT *
       FROM ${tableName}
       WHERE a = ${b}'''
)) {
    ...
}

小但非常有效的改进

这将是非常小的(就语言复杂性预算而言:只是一个新令牌),但是对于我们所有人都在Java中嵌入外部语言(SQL,XML,XPath,Regex等)的非常有效的改进。 我们做了很多。 我们讨厌它。

它不必像Xtend的多行字符串文字那样强大。

java 字符串文字筛选