首选toString()实现?

时间:2015-05-25 15:57:23

标签: java tostring stringbuilder

从以下3种不同的实现中,基于可读性,性能等,哪一个看起来像是一个好的候选者?

示例#1:

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

实施例#2:

@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();
}

实施例#3:

@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();
}

围绕此方法的其他任何最佳做法?请指教

谢谢!

3 个答案:

答案 0 :(得分:5)

示例1将在幕后为您使用单个StringBuilder。示例2和3将编译为相同的字节码但使用更多StringBuilder s,每个字符串连接一次使用非文字String时,但此情况下的开销可以被忽略了。使用可以简化特定情况的代码可读性和可维护性的那个。

IMO你应该使用选项#4:

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

答案 1 :(得分:1)

我会使用选项#1。每次在字符串上使用 | tag----------------- | \ branch-1 branch-2 并置时,选项#2和#3都会创建一个新的StringBuilder。这不是很多开销,但它可以加起来,因为你每次创建一个新对象并扔掉它。选项#1只创建一个StringBuilder,因为它只是一个很长的串联连接。

您可以重新格式化选项#1,使其看起来更好。

+

答案 2 :(得分:1)

正如旁注:

如果您不介意使用第三方库,那么您还可以查看Apache Commons Lang3中的ToStringBuilderhttp://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ToStringBuilder.html

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