Eclipse 自动生成的 toString() 方法

6
据我所知,在拼接大量字符串时,使用加号符号连接字符串并不是一个好的做法。但是当我检查Eclipse生成的toString()方法(在源文件上单击右键-> Source -> Generate toString())时,它也是这样做的。
public class Temp
 {
      private String tempName;
      private String tempValue;

      // here getters and setters

  /* (non-Javadoc)
         * @see java.lang.Object#toString()
  */
@Override
public String toString() {
    return "Temp [tempName=" + tempName + ", tempValue=" + tempValue + "]";
}

}

有没有地方可以在Eclipse中配置像下面我期望的toString()方法一样,为什么Eclipse不考虑这个?
   public String expectedToString(){
    StringBuffer sb = new StringBuffer();
    sb.append("Temp [tempName=").append(tempName).append(",").append(" tempValue=").append(tempValue).append("]");
    return sb.toString();
}

我将使用自动生成的toString()方法记录我的对象值。
请给予建议。

如果我没记错的话,现在最好的方法是使用 StringBuilder,而且现代编译器会将 String + 转换为 StringBuilder 表达式。有人能确认一下吗? - SJuan76
2
现在使用 + 进行字符串连接已经不再是一个问题了。编译器会对 + 的使用进行优化,特别是涉及多个字符串的情况。 - Chris Gerken
1
非问题:在这种情况下,“+”、“.append()”和“.concat()”应该执行相同的操作。有趣的链接:http://www.vogella.com/blog/2009/07/19/java-string-performanc/ 和 Yet again on string append vs concat vs + - paulsm4
2个回答

8

不需要改变任何东西,它很紧凑且易于阅读,javac将使用StringBuilder进行实际的拼接。如果您反编译Temp.class,您将看到。

public String toString() {
   return (new StringBuilder("Temp [tempName=")).append(tempName).append(", tempValue=").append(tempValue).append("]").toString();
}

但在其他情况下,比如:

    String[] a = { "1", "2", "3" };
    String str = "";
    for (String s : a) {
        str += s; 
    }

++=是真正的性能杀手,请查看反编译代码。

String str = "";
for(int i = 0; i < j; i++) {
    String s = args1[i];
    str = (new StringBuilder(String.valueOf(str))).append(s).toString();
}

每次迭代都会创建一个新的StringBuilder,然后转换为字符串。在这里,您应该明确使用StringBuilder。

    StringBuilder sb = new StringBuilder();
    for (String s : a) {
        sb.append(s); 
    }
    String str = sb.toString();

0
请注意,Eclipse 4.21(2021年7月,9年后)将通过以下方式促进正确的代码生成:

"使用StringBuilder而不是StringBuffer进行清理"

新增了一项清理功能,将代码转换为使用StringBuilder(Java 1.5中添加)而不是StringBuffer,因为StringBuffer具有同步方法,速度比使用StringBuilder慢。
有一个子选项,默认情况下仅更改本地变量。
当此子选项打开时,只会更改局部方法中的StringBuffer变量。
当方法调用其他带有这些变量的方法或分配给/从字段/参数时,方法内容不会被转换。
允许将StringBuffer字段或参数附加到本地StringBuffer变量中,然后仍然可以将其转换为StringBuilder
当选择该选项并关闭本地变量的子选项时,所选文件中所有StringBuffer的使用都将更改为StringBuilder,无论如何使用。
应注意,在这种情况下,清理将无法跟踪非选定类和方法的引用,并可能需要更改才能成功编译。
要应用清理,请在清理配置文件的Optimization选项卡上选择Use StringBuilder instead of StringBuffer复选框。
要仅指定本地变量,请选择下面的Only for local variables复选框。 Preferences -- https://www.eclipse.org/eclipse/news/4.21/images/stringbuffer-to-stringbuilder-prefs.png

例子:

Before -- https://www.eclipse.org/eclipse/news/4.21/images/stringbuffer-to-stringbuilder-before.png

会变成:

After -- https://www.eclipse.org/eclipse/news/4.21/images/stringbuffer-to-stringbuilder-after.png


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接