java不可变类需满足:字段全为private final;不提供修改方法,仅含getter和纯计算方法;对可变组件做防御性拷贝;类声明为final以防子类破坏不变性。

在 Java 中实现不可变类,核心是通过封装确保对象创建后其状态无法被外部修改。关键不是简单地把字段设为 private,而是从设计上切断所有可能的修改路径。
字段全部私有且用 final 修饰
所有实例字段必须声明为 private final,防止外部直接访问或重新赋值。
- 基本类型(如
int、boolean)用final即可保证值不可变 - 引用类型(如
String、LocalDate、自定义对象)也必须是final,且其自身需是不可变类,或确保不对外泄露可变内部状态
不提供任何修改状态的方法
禁止定义 setter、add、clear、reverse 等任何会改变对象内部字段的方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只保留 getter(返回字段值)和纯计算方法(如
toString()、hashCode()) - 若需“更新”对象,应返回一个新实例(如
withXXX()风格,类似LocalDateTime.withHour(10))
防御性拷贝可变组件
如果类包含可变对象(如 ArrayList、java.util.Date),构造时和 getter 中必须做深拷贝,避免外部通过引用间接修改内部状态。
- 构造器中:接收可变参数时,用
new ArrayList(original)或new Date(original.getTime())存储副本 - getter 中:不直接返回内部集合或日期引用,而是返回
new ArrayList(this.list)或new Date(this.date.getTime()) - 注意:
String、Integer、LocalDateTime等本身不可变,无需拷贝
类本身声明为 final 或确保无子类可破坏不变性
防止子类覆盖方法、引入可变字段或重写行为,从而破坏不可变契约。
- 最稳妥方式:将类声明为
final - 若不能 final(如需继承),则所有方法必须是
final,且构造逻辑严格封装,但这种做法风险高,不推荐
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










