为什么在连接中 String 比 StringBuilder 更好?

mar*_*lon 4 string stringbuilder intellij-idea

我下面的方法需要返回一个由字符串连接而成的字符串。

StringBuilder sb = new StringBuilder();
sb.append("count: ").append(this.count()).append( "\n");

return sb.toString();
Run Code Online (Sandbox Code Playgroud)

在 IntelliJ 中,代码检查建议我用如下所示的字符串替换此 StringBuilder:

String sb = "count: " + this.count() + "\n";
return sb
Run Code Online (Sandbox Code Playgroud)

我的印象是 StringBuilder 应该与append方法一起使用,以用加号替换字符串连接。这个代码检查建议在 IntelliJ 中有意义吗?

vik*_*eve 7

您的假设是正确的,大多数 IntelliJ检查鼓励您以“更好”的方式做事。

然而,这并非总是如此。特别是在某些检查“双向”工作的情况下 -> 您必须对什么是“更好”进行自己的判断。

在这种情况下,如果您以普通的连接字符串开始:

    return "count: " + count + "\n";
Run Code Online (Sandbox Code Playgroud)

有一些可用的检查 - 将光标放在上面"count: "并按 Alt-Enter:

  1. 将“+”替换为 String.format()
  2. 将“+”替换为 StringBuilder.append()
  3. 将“+”替换为 java.text.MessageFormat.format()

如果您选择选项 (2),您将得到:

    return new StringBuilder().append("count: ").append(count).append("\n").toString();
Run Code Online (Sandbox Code Playgroud)

现在,您可以再次使用 alt-enter 来选择“Replace StringBuilder with String”来反转更改。

在这种情况下,您发现了双向的检查/重构:它是双向的。其他重构(例如“封装”)仅以一种方式起作用。

至于什么是“更好” - 您必须权衡性能StringBuilder与可读性和简单性,并自己做出判断 - IntelliJ 只是提供方便的检查来帮助您;)