java - 如何为类中的私有(private)变量定义 "good"get()方法?

标签 java

我正在学习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/

相关文章:

java - 方法中的每个可能分支都应该有一个单独的 junit 吗?

java - 如何从另一个类访问另一个类函数(java)

java - 检测同根词

java - 混淆字符串引用比较 == 和 intern

java - 使用 Docker 将存档添加到 Libre Office

java - 将库添加到 Android Studio 项目

java - 从 JavaScript 向 Java 发送 JSON 时出错

java - 数组按 5's and 3' 计数,然后添加数组

java - 创建两个不同类的扫描仪

java - JPA 实体创建 - 对象与 "Primitives"