Builder 模式中应在 build() 方法内集中校验必填字段,缺失时抛出 IllegalStateException 并提供具体错误信息,避免在 setter 中校验或设静默默认值。

在 Builder 模式中,build() 方法负责创建最终对象,此时应校验所有必填字段是否已设置。若缺失,抛出 IllegalStateException 是合理选择——它表示对象当前处于非法状态,无法完成构建。
校验逻辑放在 build() 内部
不要把校验提前到 setter 中(那样会破坏链式调用的灵活性),而应在 build() 被调用时集中检查。例如:
假设构建一个 User 对象,name 和 email 为必填:
public User build() {
if (name == null || name.trim().isEmpty()) {
throw new IllegalStateException("name is required");
}
if (email == null || !email.contains("@")) {
throw new IllegalStateException("email is required and must contain '@'");
}
return new User(name, email, age);
}
使用 Objects.requireNonNull 简化非空校验
对简单非空检查,可直接用 Objects.requireNonNull,它抛出 NullPointerException ——但注意:这不是 IllegalStateException。如需统一用 IllegalStateException,就手动 throw:
立即学习“Java免费学习笔记(深入)”;
-
不推荐:
Objects.requireNonNull(name, "name is required");→ 抛 NPE -
推荐:
if (name == null) throw new IllegalStateException("name is required");
提供清晰、可定位的错误信息
异常消息要具体,方便调用方快速定位问题。避免笼统写“required field missing”,而是说明哪个字段、在哪一步缺失:
- ✅ 好:
"email cannot be null or empty in UserBuilder.build()" - ❌ 差:
"build failed"或"invalid state"
必要时可在消息中包含 builder 类名或上下文,尤其在复杂构建链中。
避免静默默认值,坚持显式约束
不要在缺失时自动设默认值(如 name = "unknown"),这会掩盖使用错误。Builder 的职责是确保构造合法对象,而不是兜底容错。强制调用方明确传入必填项,才能真正发挥校验价值。


















