假设我有一个类,里面有一个引用类型变量。我不希望该变量存储的对象的存储值能够更改,但我希望能够获取对象本身/访问其值。这需要将其私有化并创建一个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方法时都返回该对象,但对我来说,这似乎效率低下,因为它占用了内存中不必要的空间。
有没有更好的方法来读取对象,同时仍然阻止更改或我遗漏了什么?
提前谢谢。
2条答案
按热度按时间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/
7cjasjjr2#
我不知道我是否能解决你的问题。。。但是为什么不把类中的变量设为私有变量,并为它创建一个getter呢?
像这样:
如果我没弄错你的问题,请告诉我:)
致以最诚挚的问候
塞巴斯蒂安