Java 首选toString()实现?

Java 首选toString()实现?,java,tostring,stringbuilder,Java,Tostring,Stringbuilder,从以下三种不同的实现中,哪一种在可读性、性能等方面看起来是一个很好的候选者 示例#1: 示例2: 示例#3: 围绕此方法还有其他最佳实践吗?请告知 谢谢 示例1将在幕后为您使用单个StringBuilder。示例2和3将编译为相同的字节码,但使用更多的StringBuilders,当使用非文字strings时,每个字符串一个串联,但是这种情况下的开销可以忽略。针对您的具体情况,使用一种简化代码可读性和可维护性的方法 在我看来,您应该使用选项4: 我会使用选项1。每次对字符串使用+串联时,选项2和

从以下三种不同的实现中,哪一种在可读性、性能等方面看起来是一个很好的候选者

示例#1:

示例2:

示例#3:

围绕此方法还有其他最佳实践吗?请告知


谢谢

示例1将在幕后为您使用单个
StringBuilder
。示例2和3将编译为相同的字节码,但使用更多的
StringBuilder
s,当使用非文字
string
s时,每个字符串一个串联,但是这种情况下的开销可以忽略。针对您的具体情况,使用一种简化代码可读性和可维护性的方法

在我看来,您应该使用选项4:

我会使用选项1。每次对字符串使用
+
串联时,选项2和3将创建一个新的StringBuilder。这并不是很大的开销,但可能会累加起来,因为您每次都要创建一个新对象并将其扔掉。选项#1只创建一个StringBuilder,因为它只是一个大的长连接

您可以重新设置选项1的格式,使其看起来更好

@Override
public String toString() {
    return "GuiTemplateCriteriaImpl ["
            + "appTitle=" + appTitle
            + ", button1Text=" + button1Text
            + ", button2Text=" + button2Text 
            + ", defaultMessageText=" + defaultMessageText
            + ", rootFolder=" + rootFolder 
            + ", supportedFileExt=" + supportedFileExt 
            + ", list1ToolTipText=" + list1ToolTipText
            + ", list2ToolTipText=" + list2ToolTipText + "]";
}
作为旁注:

如果您不介意使用第三方库,那么您也可以查看Apache Commons Lang3中的
ToStringBuilder


它允许对输出格式进行一些自定义(使用预定义的实现或自实现的
ToStringStyle
)。

因此,使用新的StringBuilder()而不仅仅是新的String()不会对性能产生影响?您确定-编译器可以在现有的
StringBuilder
中折叠
字符串
吗?@Rookie您在哪里使用过
新字符串
?我的意思是只返回一个字符串“示例字符串”,抱歉
示例1将使用单个StringBuilder
。您能给我指出一个可靠的来源,它说第一种情况将始终使用
StringBuilder
?通过添加对该类的额外依赖性,有什么特别的好处吗?尽管Commons Lang3还包含其他有用的类(例如,
HashCodeBuilder
EqualsBuilder
用于与
ToStringBuilder
类似的目的)toString()输出可以自定义,我想它提供了一个经过验证的高性能实现。一个非常类似的问题:出于性能原因,通常使用
StringBuilder
的原因是删除所有
+
运算符连接,但是示例2和3没有这样做。参数中仍然有
+
,即argu可能会比示例1更差,这取决于编译器如何对其进行优化。那么这是否意味着如果我们从示例2中删除+的话,它实际上会比Ex#1的性能更好?如果我知道的话,其背后的原因是什么。有些人说,虽然Ex#2的开销略高,但它们都编译为相同的字节码可能会执行相同的操作。许多人指出JLS部分指出,允许编译器将+转换为一系列StringBuilder操作。如果编译器这样做,则很可能会在#1中创建一个StringBuilder,但在其他表达式中,会为包含+的每个表达式创建一个StringBuilder,除了一个表达式外,还有8个表达式你明确分配。谢谢你为我澄清这一点,迈克。非常感谢!
@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("GuiTemplateCriteriaImpl")
           .append("[")
           .append("  appTitle="    + appTitle)
           .append(", button1Text=" + button1Text)
           .append(", button2Text=" + button2Text)
           .append(", defaultMessageText=" + defaultMessageText)
           .append(", rootFolder="  + rootFolder)
           .append(", supportedFileExt=" + supportedFileExt)
           .append(", list1ToolTipText=" + list1ToolTipText)
           .append(", list2ToolTipText=" + list2ToolTipText)
           .append("]");
    return builder.toString();
}
@Override
public String toString() {
    return new StringBuilder()
           .append("GuiTemplateCriteriaImpl")
           .append("[")
           .append("  appTitle="    + appTitle)
           .append(", button1Text=" + button1Text)
           .append(", button2Text=" + button2Text)
           .append(", defaultMessageText=" + defaultMessageText)
           .append(", rootFolder="  + rootFolder)
           .append(", supportedFileExt=" + supportedFileExt)
           .append(", list1ToolTipText=" + list1ToolTipText)
           .append(", list2ToolTipText=" + list2ToolTipText)
           .append("]")
           .toString();
}
@Override
public String toString() {
    return "GuiTemplateCriteriaImpl"
        + "["
        +" appTitle=" + appTitle
        + ", button1Text=" + button1Text
        + ", button2Text=" + button2Text
        + ", defaultMessageText=" + defaultMessageText
        + ", rootFolder=" + rootFolder
        + ", supportedFileExt=" + supportedFileExt
        + ", list1ToolTipText=" + list1ToolTipText
        + ", list2ToolTipText=" + list2ToolTipText
        + "]";
}
@Override
public String toString() {
    return "GuiTemplateCriteriaImpl ["
            + "appTitle=" + appTitle
            + ", button1Text=" + button1Text
            + ", button2Text=" + button2Text 
            + ", defaultMessageText=" + defaultMessageText
            + ", rootFolder=" + rootFolder 
            + ", supportedFileExt=" + supportedFileExt 
            + ", list1ToolTipText=" + list1ToolTipText
            + ", list2ToolTipText=" + list2ToolTipText + "]";
}