Java中如何避免外部修改传入对象导致类内部属性变更?
如何避免外部修改传入Person的Car对象导致内部属性变化?
你当前的代码存在的问题是:setCar方法直接将传入的Car对象引用赋值给Person内部的car属性,这意味着外部调用者如果持有该Car对象的引用,后续修改这个对象的属性(比如调用setBrand),会直接影响Person内部的car属性值——因为两者指向内存中同一个对象。
要解决这个问题,有两种常用的思路:
1. 在Setter中创建Car对象的副本(拷贝赋值)
既然Car是可变类(提供了属性的Setter方法),我们可以在setCar方法里不直接赋值引用,而是创建一个新的Car实例,把传入对象的属性值复制过去。这样外部的原Car对象和Person内部的car就是两个独立的实例,互相不会影响。
修改后的Person类代码:
public class Person{ private String name; private Car car; // name的getter和setter方法 // .... // 修改getCar,返回内部car的副本,防止外部通过getter拿到引用后修改 public Car getCar(){ Car copyCar = new Car(); copyCar.setBrand(this.car.getBrand()); return copyCar; } // 修改setCar,传入时创建副本 public void setCar(Car car){ Car newCar = new Car(); newCar.setBrand(car.getBrand()); this.car = newCar; } }
注意:这里同时修改了
getCar方法——如果直接返回内部的car引用,外部拿到后依然可以修改其属性,返回副本能彻底切断外部对内部状态的修改路径。
2. 将Car改为不可变类
如果业务允许,把Car设计成不可变类是更彻底的解决方案。不可变类的对象一旦创建,其属性就无法被修改,自然不存在外部修改影响内部的问题。
修改后的Car类代码:
public class Car { // 用final修饰属性,确保一旦赋值就无法修改 private final String brand; // 通过构造器初始化所有属性,不提供Setter方法 public Car(String brand) { this.brand = brand; } // 只提供Getter方法,用于读取属性 public String getBrand() { return brand; } }
此时Person的setCar方法可以保持原样,因为即使外部持有传入的Car引用,也没有办法修改它的属性:
public void setCar(Car car){ this.car = car; }
这种方案的优势是代码更简洁,同时不可变对象天生具备线程安全性,适合多线程场景。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

