神刀安全网

Please, Java. Do Finally Support Multiline String Literals

I understand the idea of Java-the-language being rather hard to maintain in a backwards-compatible way. I understand the idea of JDK API, such as the collections, to be rather tough not to break. Yes.

I don’t understand why Java still doesn’t have multiline string literals.

How often do you write JDBC code (or whatever other external language or markup, say, JSON or XML you want to embed in Java) like this?

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

What’s the issue?

  • Syntax correctness , i.e. don’t forget to add a whitespace at the end of each line
  • Style in host language vs style in external language , sure the above code looks “nicely” formatted in Java, but it’s not formatted for the consuming server side
  • SQL injection , didn’t we teach our juniors not to perform this kind of string concatenation in SQL, to prevent SQL injection? Sure, the above is still safe, but what keeps a less experienced maintainer from embedding, accidentally, user input?

Today, I was working with some code written in Xtend , a very interesting language that compiles into Java source code. Xtend is exceptionally useful for templating (e.g. for generating jOOQ’sRecord1 –Record22 API). I noticed another very nice feature of multi line strings:

The lack of need for escaping!

Multi line strings in Xtend are terminated by triple-apostrophes. E.g.

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

Yes, the above is a valid Java regular expression. I’m escaping the dots when matching imports of the AutoCloseable type. I don’t have to do this tedious double-escaping that I have to do in ordinary strings to tell the Java compiler that the backslash is really a backslash, not Java escaping of the following character:

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

So… Translated to our original SQL example, I would really like to write this, instead:

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

With a big nice-to-have plus: String interpolation (even PHP has it)!

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

Small but very effective improvement

This would be a very small (in terms of language complexity budget: Just one new token) but very effective improvement for all of us out there who are embedding an external language (SQL, XML, XPath, Regex, you name it) in Java. We do that a lot. And we hate it.

It doesn’t have to be as powerful as Xtend’s multiline string literals ( which really rock with their whitespace management for formatting, and templating expressions ). But it would be a start.

Please, make this a New Year’s resolution! :)

原文  http://blog.jooq.org/2015/12/29/please-java-do-finally-support-multiline-strings/

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Please, Java. Do Finally Support Multiline String Literals

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮