我正在为一个班级写一个equals(Object obj)
函数。我看到可以从调用者访问obj
的私有字段。所以不要使用getter:
Odp other = (Odp) obj;
if (! other.getCollection().contains(ftw)) {
}
我可以直接访问该字段:
Odp other = (Odp) obj;
if (! other.collection.contains(ftw)) {
}
这是不好的做法吗?
答案 0 :(得分:9)
我倾向于总是使用getter,因为有时候getter不仅仅是“return(foo)”。有时,如果它们为空,或者在其中包含一些调试日志,或者以某种方式验证当前状态,它们会初始化。它更加一致。
答案 1 :(得分:6)
不,不是。私有变量和方法无法从其他类访问的原因是允许您更改类的内部,而无需更改使用该类的所有代码(并且防止类的用户例如设置变量)到一个它从未应该拥有的价值。
如果你使用其他对象的私有变量不会伤害任何东西,因为如果你重构你的类的内部,你必须改变类中的代码。
答案 2 :(得分:5)
我不认为这是不好的做法,而是语言的一个特点。它不仅允许您以您的方式测试equals
,而且在创建对象的Prototype模式中也很有用。
答案 3 :(得分:1)
这很好,完全正常。认为this
可以摆弄other
的私人领域有点奇怪,但是没关系,因为就某些第三方能够捣乱而言,没有任何不好的事情可以发生。 Odp
对象的内部。 Odp
类的任何方法都可以修改任何Odp
对象的任何私有成员,甚至是非this
对象,但这很好,因为任何此类方法显然都可以信任!
答案 4 :(得分:1)
这是
的重复Why can I access my private variables of the "other" object directly, in my equals(Object o) method
私有数据可由该类的任何实例访问,即使A类的一个实例正在访问另一个A实例的私有成员。重要的是要记住访问修饰符(private,protected,public)是控制类访问,而不是实例访问
答案 5 :(得分:0)
将私有成员用于实体类可能会导致代理类错误地工作。 想象一下,hibernate通过延迟查询创建类。如果检查成员变量,则返回null。 但是如果你调用get(),它将从数据库中获取数据并初始化该字段。