自定义不可变类是Java中实现线程安全最轻量、最可靠的方式之一:类与字段均需声明为final,构造器须安全初始化且不泄露this引用,对外提供防御性拷贝与只读接口。

自定义不可变类是 Java 中实现线程安全最轻量、最可靠的方式之一。只要满足几个关键约束,对象一旦创建就完全无法被修改,多线程读取时无需任何同步措施。
类和字段都必须声明为 final
这是不可变性的基础保障:
- 类用 public final class Xxx 声明,防止子类覆写方法破坏不可变性
- 所有字段必须是 private final,确保只能在构造器中赋值一次,之后无法重新指向其他对象
- 基本类型(int、boolean 等)用 final 即可彻底锁定值
- 引用类型(如 String、LocalDateTime、自定义对象)还需保证其自身也是不可变的
构造器要安全完成初始化
构造过程不能泄露 this 引用,否则其他线程可能看到未初始化完成的对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要在构造器中调用 非 final 方法(包括 public 或 protected 方法),避免子类重写导致逻辑提前执行
- 不要在构造器中启动新线程或注册监听器,这些操作可能持有 this 引用
- 所有字段必须在构造器内完成初始化,不依赖后续 setter 或懒加载
对可变组件做防御性拷贝
如果类需要封装外部传入的可变对象(比如 List、Date、数组),不能直接保存原始引用:
立即学习“Java免费学习笔记(深入)”;
- 集合类:用 new ArrayList(original) 或 List.copyOf(original)(Java 10+)复制一份
- 返回 getter 时,用 Collections.unmodifiableList(list) 包装,禁止外部修改
- 日期类:优先使用 java.time 下的不可变类型(如 LocalDateTime),避免 Date 和 Calendar
- 数组:用 Arrays.copyOf(original, original.length) 创建副本
只提供只读访问,不暴露修改入口
对外接口必须封闭所有状态变更通道:
- 不提供任何 setter、add、remove、clear 等修改方法
- getter 方法返回不可变对象或防御性拷贝,绝不返回原始可变对象引用
- 如需“更新”语义,应设计为返回新实例(类似 String.concat() 或 BigDecimal.add())
- 避免缓存、懒加载或内部状态计算等可能引入可变性的逻辑

















