我正在学习Java,我有一些疑问。 如果定义一个带有私有(private)变量的类,例如
class test<A>{
private A var;
...
public A get(){
return var;
}
}
是不是get方法错误? 我认为是这样,因为通过这个定义我可以修改变量“var”,例如
test<A> x = new test<A>();
A temp = x.get();
temp.set(*something*);
最后 x 被更改(我使用 Vector 作为 A 进行了测试)。如果我理解正确的话,这是因为对象引用(我错过了 C 指针,呜呜)。我错了吗?也许我不明白关键字“private”的用途!提前致谢!
编辑:我对“按引用传递”和“按值传递”没有任何问题。我对为类中的私有(private)变量定义 get() 方法有疑问(你不说?)。请停止链接Is Java "pass-by-reference" or "pass-by-value"?
最佳答案
如果您的 getter 方法返回对可变对象的引用,那么这会极大地削弱您的类提供的封装质量,因为可以在不调用类的方法。
J. Bloch 称之为“防御性副本”(Effective Java,第 3 版,第 50 项:“在需要时制作防御性副本”),是防范此问题的一个标准策略。
这意味着在 getter 方法中创建 var
的副本,并返回该副本。如何做到这一点取决于A
的设计。
由于 A
是类型参数,因此制作实例的副本需要设计中的额外支持。要了解如何使用 Java 的克隆机制来实现此目的,请参阅我的 answer到帖子“创建 Copyable
类型接口(interface)而不是使用 Cloneable
有意义吗?”。
关于java - 如何为类中的私有(private)变量定义 "good"get()方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975347/