Builder模式中应复用单个StringBuilder实例,在构造时初始化,setter方法仅append,build()时才toString(),避免中间字符串创建和频繁new对象。

在 Builder 模式中高效使用 StringBuilder,核心是避免重复创建、减少字符串拼接开销,并保持构建器的可重用性与线程安全(如需)。关键不是“每次调用都 new 一个 StringBuilder”,而是复用实例、延迟计算、按需构建。
复用单个 StringBuilder 实例,避免频繁创建
Builder 类内部应持有 StringBuilder 字段,在构造时初始化一次。每次 setter 方法(如 name(String)、desc(String))直接追加内容,而不是拼接后再赋值。
- ❌ 错误:每次调用都 new 新 StringBuilder 并 toString() → 多余对象 + GC 压力
- ✅ 正确:Builder 初始化时 new 一次,后续 append() 复用同一实例
延迟 toString(),只在 build() 时生成最终字符串
不要在每个 setter 中调用 toString() 或提前转成 String。Builder 的字段应保持为 StringBuilder,直到 build() 被调用才一次性生成不可变结果。
- 避免中间态字符串对象(如 name + " - " + desc),全部由 StringBuilder 统一管理
- 若需格式化(如添加分隔符),可在
build()中统一处理,而非分散在各方法里
注意线程安全与可重用性取舍
StringBuilder 本身非线程安全,但 Builder 通常是局部变量(方法内创建、链式调用、立即 build),天然无并发风险。无需同步或改用 StringBuffer。
- Builder 对象一般不共享、不复用,build 后即丢弃 → 安全且轻量
- 若真需复用 Builder(如池化),应在
build()后重置 StringBuilder(setLength(0)),而非新建
示例:简洁高效的 Builder 内部 StringBuilder 使用
(省略 getter/setter 校验等细节,聚焦 StringBuilder 使用逻辑)
public class MessageBuilder {
private final StringBuilder content = new StringBuilder();
<pre class="brush:php;toolbar:false;">public MessageBuilder title(String t) {
if (t != null) content.append("【").append(t).append("】");
return this;
}
public MessageBuilder body(String b) {
if (b != null) content.append("\n").append(b);
return this;
}
public MessageBuilder footer(String f) {
if (f != null) content.append("\n— ").append(f);
return this;
}
public String build() {
return content.toString(); // 仅此处触发最终字符串生成
}}
调用:new MessageBuilder().title("通知").body("系统已更新").footer("2024-04-01").build()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











