java不可变类需将所有字段声明为private final,构造器完成初始化且不提供setter;对可变引用类型做防御性拷贝;getter返回不可变视图;类本身应声明为final。

设计 Java 中的不可变类,核心是禁止外部修改对象状态,所有字段必须私有、final,且不提供任何修改内部数据的方法;同时要确保对象内部引用的可变组件也不被外界篡改。
字段全部声明为 private final
这是不可变性的基础。每个字段都必须用 private 封装,并用 final 修饰,保证构造后无法重新赋值或访问:
- 基本类型(如 int、boolean)天然安全,final 即可
- 引用类型(如 String、List、自定义对象)需额外注意防御性拷贝
构造器完成全部初始化,不暴露 setter 方法
所有状态必须在构造时一次性设定,之后不再允许变更:
- 不提供任何 public 的 setter 或 modify 方法
- 若构造参数含可变对象(如传入 ArrayList),需做深拷贝或转为不可变视图(如 Collections.unmodifiableList)
- 例如:接收 List 参数时,应写成
new ArrayList(originalList)或Collections.unmodifiableList(new ArrayList(originalList))
返回值也需防御性处理
当提供 getter 方法返回内部引用时,不能直接返回原始对象:
- 对于数组,返回
Arrays.copyOf(arr, arr.length)或包装为不可变集合 - 对于 Collection/Map,用
Collections.unmodifiableXXX()包装 - 对于自定义可变对象,要么返回其不可变副本,要么确保该类本身也是不可变的
类本身声明为 final(推荐)
防止子类通过继承破坏不可变性:
- 加上
final class MyImmutableClass,避免被继承重写方法或引入新状态 - 如果不加 final,至少要把所有方法设为 final,但不如类级别 final 简洁可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











