来自Perl,我肯定错过了在源代码中创建多行字符串的“here-document”方法:

$string = <<"EOF"  # create a three-line string
text
text
text
EOF

在Java中,当我从头开始连接多行字符串时,我必须在每一行上使用繁琐的引号和加号。

有什么更好的选择吗?在属性文件中定义我的字符串?

编辑:有两个答案说StringBuilder.append()比加号更可取。谁能详细解释一下他们为什么这么想?在我看来,这一点也不可取。我正在寻找一种方法来解决多行字符串不是一级语言结构这一事实,这意味着我绝对不想用方法调用取代一级语言结构(字符串连接与加号)。

编辑:为了进一步澄清我的问题,我根本不关心性能。我关心的是可维护性和设计问题。


当前回答

你可以使用scala-code,它与java兼容,并且允许用""" "括起来的多行字符串:

package foobar
object SWrap {
  def bar = """John said: "This is
  a test
  a bloody test,
  my dear." and closed the door.""" 
}

(注意字符串内的引号)和来自java:

String s2 = foobar.SWrap.bar ();

这样是否更舒服?

另一种方法,如果你经常处理长文本,应该放在你的源代码中,可能是一个脚本,它从外部文件中获取文本,并将其包装为一个多行java- string,像这样:

sed '1s/^/String s = \"/;2,$s/^/\t+ "/;2,$s/$/"/' file > file.java

这样你就可以很容易地复制粘贴到你的源代码中。

其他回答

这看起来可能有点疯狂,但由于这里文档是单行声明的语法糖,并转义了换行符,因此可以为Java文件编写预处理程序,在预处理期间将这里文档更改为单行。

这需要在编译阶段(对于ant/maven构建)之前为预处理文件编写适当的插件,并为IDE编写插件。

从意识形态的观点来看,它与f.g.没有什么不同。“泛型”,这也是一种预处理的语法加糖铸造。

然而,这是一个大量的工作,所以我会在你的地方只使用.properties文件。

JEP 378: Text Blocks涵盖了此功能,并且包含在JDK 15中。它最初出现在JDK 13中的JEP 355: Text Blocks(预览)和JDK 14中的JEP 368: Text Blocks(第二预览),可以在这些版本中通过——enable-preview javac选项启用。

语法允许这样写:

String s = """
           text
           text
           text
           """;

在此之前,在JDK 12中,JEP 326: Raw String Literals旨在实现类似的功能,但最终被撤回:

请注意:这原本是JDK 12中的预览语言功能,但它已被撤回,并没有出现在JDK 12中。它在JDK 13中被文本块(JEP 355)所取代。

参见Java Stringfier。如果需要,将文本转换为StringBuilder java块转义。

你可以在一个单独的方法中连接你的追加:

public static String multilineString(String... lines){
   StringBuilder sb = new StringBuilder();
   for(String s : lines){
     sb.append(s);
     sb.append ('\n');
   }
   return sb.toString();
}

无论哪种方式,都更喜欢StringBuilder而不是加号符号。

String newline = System.getProperty ("line.separator");
string1 + newline + string2 + newline + string3

但是,最好的替代方法是使用String.format

String multilineString = String.format("%s\n%s\n%s\n",line1,line2,line3);