Java:直接从同一个类的另一个实例访问私有字段

时间:2009-10-10 19:43:37

标签: java scope private member

我正在为一个班级写一个equals(Object obj)函数。我看到可以从调用者访问obj的私有字段。所以不要使用getter:

Odp other = (Odp) obj;
if (! other.getCollection().contains(ftw)) {

}

我可以直接访问该字段:

Odp other = (Odp) obj;
if (! other.collection.contains(ftw)) {

}

这是不好的做法吗?

6 个答案:

答案 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(),它将从数据库中获取数据并初始化该字段。