Nope, I don't think multi-line string literals are an attractive nuisance in any way. We should NOT deem it incorrect to refactor a sequence of concatenations into a single multi-line string literal. Developers are chomping at the bit to do it, and if we cast doubt on the ability then we're wasting everyone's time. We should deem it correct, and 99% of the time no-one will care that newline characters exist in the string. The rare library that subtly misbehaves or (and this is the better option) actually blow ups when seeing newlines will feel great pressure to become more liberal in what it accepts, and that is a good thing.

Alex

On 4/19/2019 7:42 PM, Guy Steele wrote:
So is your point that multiline string literals may be an “attractive nuisance” 
in that they may make it too convenient for inattentive programmers to perform 
_incorrect_ refactoring?


On Apr 19, 2019, at 8:16 PM, Alex Buckley <alex.buck...@oracle.com> wrote:

On 4/10/2019 8:22 AM, Jim Laskey wrote:
Line terminators:  When strings span lines, they do so using the line
terminators present in the source file, which may vary depending on what
operating system the file was authored.  Should this be an aspect of
multi-line-ness, or should we normalize these to a standard line
terminator?  It seems a little weird to treat string literals quite so
literally; the choice of line terminator is surely an incidental one.  I
think we're all comfortable saying "these should be normalized", but its
worth bringing this up because it is merely one way in which incidental
artifacts of how the string is embedded in the source program force us
to interpret what the user meant.

No-one has commented on this, but it's important because some libraries are 
going to be surprised by the presence of line terminators, of any kind, in 
strings denoted by multi-line string literals.

To be clear, I agree with normalizing line terminators. And, I understand that 
any string could have contained line terminators thanks to escape sequences in 
traditional string literals. But, it was not common to see a \n except where 
multi-line-ness was expected or harmless. Going forward, who can guarantee that 
refactoring the argument of `prepareStatement` from a sequence of 
concatenations:

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

to a multi-line string literal:

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

is behaviorally compatible for `prepareStatement`? It had no reason to expect 
\n in its string argument before.

(Hat tip: 
https://blog.jooq.org/2015/12/29/please-java-do-finally-support-multiline-strings/)

Maybe `prepareStatement` will work fine. But someone somewhere is going to take a program 
with a sequence of 2000 concatenations and turn them into a huge multi-line string 
literal, and the inserted line terminators are going to cause memory pressure, and GC is 
going to take a little longer, and eventually this bug will be filed: "My system 
runs 5% slower because the source code changed a teeny tiny bit."

In reality, a few libraries will need fixing, and that will happen quickly 
because developers are very keen to use multi-line string literals. But it's 
fair to point out that while everyone is worrying about whitespace on the left 
of the literal, the line terminators to the right are a novel artifact too.

Alex

Reply via email to