final vs immutable 在 Java 中:它们并不相同
发布: (2025年12月27日 GMT+8 12:30)
2 min read
原文: Dev.to
Source: Dev.to
关键概念
Final:阻止对引用的重新赋值,而不是阻止对内容的修改。如果对象是可变的,仍然可以对其进行操作。
不可变:对象在构造后不再改变。它不暴露修改器,并且如果包含集合,也不允许从外部修改。
示例
final 应用于可变集合
final List items = new ArrayList<>();
items.add("alpha"); // OK
// items = new ArrayList<>(); // Error: cannot assign a value to final variable
真正的不可变类
public final class UserId {
private final String value;
public UserId(String value) {
this.value = value;
}
public String value() {
return value;
}
}
这样的一类不会暴露修改器,其状态在构造时即被固定。
实现真正不可变性的方式
- 将字段声明为
private和final。 - 不包含 setter 方法。
- 如果需要暴露可变数据,返回防御性拷贝或不可变集合(例如 Java 10+ 的
List.copyOf)。
推荐操作
检查返回可变 List 的 API。将方法改为返回不可变集合或其拷贝,并添加测试以验证消费者无法修改该列表。通过此调整,可获得更清晰、更安全的代码,减少生产环境中的意外。