静态内部类是实现高效不可变对象设计的天然搭档——它既保持类结构的内聚性,又避免实例耦合,还能精准控制构建逻辑与状态封装。

用静态 Builder 类封装构造过程
把对象创建逻辑移入 private static class Builder,外部类只保留 final 字段和私有构造器。Builder 中字段与外部类一一对应(也用 private final),每个 setter 返回 this 实现链式调用,build() 方法调用外部类私有构造器完成实例化。
- 静态内部类不持有外部类引用,内存轻量、语义清晰,符合“构建工具”的定位
- 必填字段建议放在 Builder 构造器中(如
new Builder(String id, String name)),编译期强制约束 - 可选字段通过 setter 提供,默认值在 Builder 字段声明时设定(如
private String status = "ACTIVE")
外部类彻底不可变:final + 私有 + 无 setter
主类所有字段必须是 private final,构造器完成全部初始化,且不暴露任何修改状态的方法。
- 禁止提供 public setter、addXXX、clear 等可变接口
- 若含可变组件(如 List、Date、数组),getter 必须返回防御性副本:用
Collections.unmodifiableList()、Arrays.copyOf()或新建对象(如return new Date(this.birthday.getTime())) - 类本身声明为 public final class Xxx,杜绝子类破坏不可变契约
静态内部类辅助封装共享不变状态
当不可变对象需复用常量、预计算结果或线程安全缓存时,可用另一个 private static class Helper 封装。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如预定义格式化器、校验规则表、枚举映射等,声明为
private static final Map<String, Rule> RULES = ... - 仅暴露 public static 方法作为访问入口,内部做空值检查或同步控制
- 避免直接暴露静态可变容器(如 public static List),防止外部误操作破坏一致性
规避常见破绽
即使结构看似封闭,几个细节仍可能悄悄破坏不可变性:
立即学习“Java免费学习笔记(深入)”;
- 构造器中不要调用非 final 方法(子类可能重写并访问未初始化字段)
- 绝不将
this在构造过程中传给外部(如注册监听、放入静态集合),防止 this 逃逸 - Builder 的 build() 方法应校验关键字段(如 null 检查、范围判断),失败抛
IllegalArgumentException - 每次调用静态工厂方法(如
Xxx.builder())必须返回新 Builder 实例,避免链式调用污染

















