11

我正在equals(Object obj)为一个类编写一个函数。我看到可以obj从调用者访问私有字段。所以不要使用吸气剂:

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

}

我可以直接访问该字段:

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

}

这是不好的做法吗?

4

6 回答 6

9

我倾向于总是使用吸气剂,因为有时吸气剂不仅仅是“return(foo)”。有时,如果它们为空,它们会初始化事物,或者在其中进行一些调试日志记录,或者以某种方式验证当前状态。它更加一致。

于 2009-10-10T19:46:44.223 回答
6

不,这不对。私有变量和方法无法从其他类访问的原因是允许您更改类的内部,而不必更改使用该类的所有代码(以及防止您的类的用户设置变量)到一个它不应该有的值)。

如果您使用其他对象的私有变量不会造成任何伤害,因为如果您要重构类的内部结构,那么无论如何您都必须更改类内部的代码。

于 2009-10-10T19:49:59.787 回答
5

我不认为这是不好的做法,而是语言的一个特点。它不仅允许您测试您equals的工作方式,而且在创建对象的原型模式中也很有用。

于 2009-10-10T19:53:23.117 回答
1

这很好,完全正常。this认为可以摆弄 的私有字段有点奇怪other,但这没关系,因为就某些第三方能够弄脏Odp对象的内部结构而言,不可能发生任何不好的事情。类的任何方法都Odp可以修改任何Odp对象的任何私有成员,甚至是非私有成员this,但这很好,因为任何此类方法显然都可以信任!

于 2009-10-10T19:48:42.317 回答
1

这是一个重复

为什么我可以在我的 equals(Object o) 方法中直接访问“其他”对象的私有变量

该类的任何实例都可以访问私有数据,即使 A 类的一个实例正在访问 A 的另一个实例的私有成员。重要的是要记住访问修饰符(私有、受保护、公共)控制的是类访问,而不是实例访问

于 2013-07-02T17:06:09.760 回答
0

对实体类使用私有成员可能会导致代理类工作不正确。想象一下休眠通过惰性查询创建类。如果检查成员变量,则返回 null。但是如果您调用 get() ,它将从数据库中获取数据并初始化该字段。

于 2012-11-02T07:43:06.927 回答