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