考虑一个带有"buildMessage"方法的类(类似于):
public class MessageBuilder {
public String buildMessage() {
//Build up the message and return
//
//Get the header
//Get the body
//Get the footer
//return
}
}
Run Code Online (Sandbox Code Playgroud)
当我们建立我们的消息,这是优选构筑了一个StringBuilder(或类似的缓冲对象)的字符串,而不是仅仅concating一堆串在一起.但这是否意味着你失去了返回String的好处,而不是将StringBuilder作为参数?
换句话说,这很好读,很容易理解:
private String getHeader() {
StringBuilder builder = new StringBuilder();
builder.append("Hello ")
.append(this.firstname)
.append(",\n");
return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)
这对我来说比被迫传递给StringBuilder更自然,但我们也可以写:
private void appendHeader(StringBuilder builder) {
builder.append("Hello ")
.append(this.firstname)
.append(",\n");
}
Run Code Online (Sandbox Code Playgroud)
第一个选项使得可以使用"get"方法,即使意图不是将返回的值附加到缓冲区.它还使公共方法易于理解:
public class MessageBuilder {
public String buildMessage() {
StringBuilder builder = new StringBuilder();
builder.append(getHeader())
.append(getBody())
.append(getFooter());
return builder.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
使用第二个选项时会导致:
public …Run Code Online (Sandbox Code Playgroud) 字符串类是不可变的,其背后的原因之一是该类被声明为final,尽管还有其他原因.但是为什么StringBuffer或StringBuilder最终仍然是可变的?那么还有哪些因素决定String是不可变的?