返回的对象更改私有引用变量值

mzmfm0qo  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(283)

假设我有一个类,里面有一个引用类型变量。我不希望该变量存储的对象的存储值能够更改,但我希望能够获取对象本身/访问其值。这需要将其私有化并创建一个getter,而不是setter。但是,这样做只会限制我更改变量指向的对象的能力,但不会阻止我更改对象本身的值。

private void program(){

    Test test = new Test(3);

    out.println(test.getA().a); // initial value, prints 3

    test.getA().a = 4; // changes referenced value through getter, even though the object is private, and has no setter

    out.println(test.getA().a); // changed value, prints 4

}

class Test{
    private A a;

    public Test(int a){
        this.a = new A(a);
    }

    public A getA(){
        return a;
    }
}

class A{
    public int a;

    public A(int a){
        this.a = a;
    }
}

在上面的代码中,我可以使用getter来访问对象的值,尽管我将变量设为private是为了防止这种情况发生。我看到的唯一方法是创建一个新的a对象,每次调用getter方法时都返回该对象,但对我来说,这似乎效率低下,因为它占用了内存中不必要的空间。
有没有更好的方法来读取对象,同时仍然阻止更改或我遗漏了什么?
提前谢谢。

q3aa0525

q3aa05251#

这是一个常见问题,主要有两种解决方案:
您在getter中使用copy构造函数或clone()方法描述的方式
你可以使你的a类不可变-只需使所有字段都是最终的,并通过构造函数或嵌套生成器初始化它一次
我还建议不要公开值类型字段
有用链接:
https://www.baeldung.com/java-immutable-object
https://www.journaldev.com/129/how-to-create-immutable-class-in-java
https://web.mit.edu/6.005/www/fa15/classes/09-immutability/

7cjasjjr

7cjasjjr2#

我不知道我是否能解决你的问题。。。但是为什么不把类中的变量设为私有变量,并为它创建一个getter呢?
像这样:

class A{
    private int a;

    public A(int a){
        this.a = a;
    }

    public int getA() {
        return this.a;
    }

}

如果我没弄错你的问题,请告诉我:)
致以最诚挚的问候
塞巴斯蒂安

相关问题