不可变类通过final类、private final字段、构造器初始化、防御性拷贝、无修改方法等确保线程安全。所有状态创建后不可变,无需同步,多线程可安全共享。

设计不可变类是 Java 中实现线程安全最简洁有效的方式之一——只要类一旦创建,其状态就永远不可更改,自然无需同步,所有线程可安全共享。
确保类不可被继承
防止子类通过重写方法破坏不可变性:
- 将类声明为 final(推荐)
- 或把构造器设为 private,并提供静态工厂方法(适用于需要灵活实例化但又不允许继承的场景)
所有字段私有且 final
这是不可变性的核心保障:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 字段用 private final 修饰,禁止外部访问和运行时修改
- 包括基本类型、包装类、String、其他已知不可变类(如 LocalDate、BigInteger)
- 若含可变对象(如 ArrayList、Date、自定义可变类),必须做防御性拷贝(见下条)
构造器完成全部初始化,不暴露可变内部状态
避免“this 逸出”和外部持有内部可变引用:
- 所有字段在构造器中一次性赋值,不调用可能被子类重写的方法
- 若参数是可变对象(如传入一个 ArrayList),需用 new ArrayList(param) 等方式深拷贝,不直接赋值引用
- getter 方法返回内部可变对象时,也必须返回副本(如 return new ArrayList(this.list)),而非原引用
不提供任何修改状态的方法
杜绝 setter、add、clear、reverse 等任何改变内部字段的行为:
- 只保留 getter、toString、equals、hashCode 等只读方法
- 若需“修改”,应返回一个新对象(如 String 的 substring、LocalDateTime 的 withHour)
- 确保 equals 和 hashCode 基于 final 字段计算,且不依赖可变外部状态
不复杂但容易忽略。关键不在代码量,而在每一步是否真正切断了所有修改路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










