You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:36:09