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对模板非常有用(例如,用于生成jOOQ的Record1 – Record22 API)。 我注意到多行字符串的另一个非常好的功能:
无需逃脱!
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_tableWHERE 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的多行字符串文字那样强大( 它确实与用于格式设置和模板化表达式的空白管理结合在一起 )。 但这将是一个开始。
请把它作为新年的决议! :)
翻译自: https://www.javacodegeeks.com/2016/01/please-java-finally-support-multiline-string-literals.html
java 字符串文字筛选