在 java 中,通过 builder 模式简化对象创建的核心做法是定义一个静态内部类,在其中提供所有必填字段的 setter 方法并返回自身实例,同时提供一个 build() 方法用于校验参数并调用外部类的私有构造函数生成不可变对象。这样做可以彻底消除冗长的构造函数链或重叠构造器问题,让代码的意图一目了然。

Builder 类如何收集参数并构建最终对象
Builder 类通过持有与目标对象相同的字段来收集参数,并在每次赋值后返回 Builder 实例本身以支持链式调用。当所有必要参数设置完毕后,调用 build() 方法会执行必要的逻辑检查(如非空验证),然后使用这些收集到的值实例化外部的不可变对象。

public class User {
private final String name;
private final int age;
private final String email;
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
}
public static class Builder {
private String name;
private int age;
private String email;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public User build() {
if (this.name == null) {
throw new IllegalStateException("Name must be set");
}
return new User(this);
}
}
}
上述代码展示了标准的实现结构。外部类 User 的构造函数被标记为 private,强制使用者必须通过 Builder 进行创建。内部类 Builder 中的每个配置方法都返回 this,从而允许像 new User.Builder().name("Alice").age(30).email("alice@example.com").build() 这样流畅的代码编写方式。
如何处理可选参数与默认值
Builder 模式天然支持可选参数,因为调用者可以跳过某些字段的设置。对于有默认值的字段,可以在 Builder 的构造函数或初始化块中赋予初始值,或者在 build() 方法中进行回退处理。这种方式比使用多个重载构造函数要清晰得多,特别是当参数数量超过三个时。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

public class Notification {
private final String title;
private final String message;
private final boolean isPriority;
private Notification(Builder builder) {
this.title = builder.title;
this.message = builder.message;
this.isPriority = builder.isPriority;
}
public static class Builder {
private String title;
private String message;
private boolean isPriority = false; // 默认值
public Builder title(String title) {
this.title = title;
return this;
}
public Builder message(String message) {
this.message = message;
return this;
}
public Builder priority(boolean isPriority) {
this.isPriority = isPriority;
return this;
}
public Notification build() {
if (this.title == null || this.message == null) {
throw new IllegalArgumentException("Title and Message are required");
}
return new Notification(this);
}
}
}
在这个例子中,isPriority 字段在 Builder 中被赋予了默认值 false。如果用户在构建 Notification 时没有调用 priority() 方法,该字段将保持为默认状态。这种机制使得 API 的使用者无需关心哪些参数是必须的,哪些是有默认值的,只需关注他们想要自定义的部分。
Builder 模式在复杂对象创建中的具体应用
当对象包含大量字段且部分字段之间存在依赖关系时,Builder 模式的优势尤为明显。例如,在一个配置类中,某些选项只有在特定模式下才有效。通过在 build() 方法中加入复杂的业务逻辑校验,可以确保生成的对象始终处于合法状态,而不会在对象创建过程中抛出异常导致状态不一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










