如何在Java中实现不可变对象,避免对象创建后被修改?
如何在Java中实现不可变对象,避免对象创建后被修改?
嘿,我完全懂你想让Car对象一旦创建就不能被修改的需求!在Java里实现不可变对象其实有一套非常成熟的做法,我来一步步教你改造你的代码:
- 删掉所有Setter方法:这是最直接的一步,你的
setModel就是用来修改属性的根源,直接把它删掉就行,确保外部没有办法直接修改对象的内部状态。 - 把成员变量标记为
final:final修饰的变量一旦在构造器里完成赋值,就再也不能被修改了。这样从底层上保证了这些属性的值不会被篡改。 - 把整个类标记为
final:防止其他类继承你的Car类,避免子类通过重写方法或者新增逻辑来破坏不可变性。
按照这些规则修改后,你的Car类就变成这样了:
public final class Car { private final String model; private final int year; public Car(String model, int year) { this.model = model; this.year = year; } // 只保留getter方法,让外部可以读取属性但不能修改 public String getModel() { return model; } public int getYear() { return year; } }
这里还要额外提个小细节:如果你的类里有引用类型的成员变量(比如List、自定义对象这类),那光做上面几步还不够。比如如果Car里有个private final List<String> features,那外部拿到这个List的引用后还是能修改里面的元素。这时候你需要做防御性拷贝:
- 在构造器里,不要直接赋值传入的引用,而是创建一个新的拷贝(比如
this.features = new ArrayList<>(features);) - 在getter方法里,也不要直接返回原引用,而是返回一个不可变的视图或者拷贝(比如
return Collections.unmodifiableList(features);)
这样就能彻底保证整个对象的状态从创建那一刻起就完全不可变啦!
备注:内容来源于stack exchange,提问作者Hind27
相关产品推荐
相关产品推荐

