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

12

我正在为一个类编写equals(Object obj)函数。我发现可以从调用者访问obj的私有字段。因此,我不使用getter:

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

}

我可以直接访问该字段:

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

}

这是不好的实践吗?


1
在POJO中,使用getter还是直接访问字段? - ChssPly76
6个回答

9

我倾向于始终使用getter,因为有时getter不仅仅是“return(foo)”。有时它们会在为空时初始化一些内容,或者在其中包含一些调试日志,或者以某种方式验证当前状态。这样更加一致。


如果由于某种原因,“collection”可以重命名以更清晰地说明其目的,我宁愿在一个地方更改它,而不是每个使用getter的地方都要更改。+1 - Andrew Campbell

6
不,不是这样的。私有变量和方法无法从其他类中访问的原因是为了让您更改类的内部而无需更改使用该类的所有代码(以及防止类的用户将变量设置为其永远不应该具有的值)。
如果您使用其他对象的私有变量,那也没有问题,因为如果您重构类的内部,您必须在类内部更改代码。

1
仅仅因为它在99%的情况下能够工作,并不意味着这就是正确的做法。这会破坏封装性,使类之间的耦合更加紧密,而这一切都只是为了节省五个字符的输入。请查看我的答案。 - dj_segfault
4
“更紧密地将类别捆绑在一起”的意思是指哪些类别?这里只有一个类别受到关注,而且你无法将一个类别与自身“解耦”。 - sepp2k
2
我不同意这个答案。最好使用访问器。 - Nicolas Barbulesco
1
访问器可能会执行特殊操作,例如克隆...当您直接访问字段时,会绕过这些操作。这破坏了访问器的目标。 - Nicolas Barbulesco
1
@Sepp2k — 不一定。例如,我正在开发一个类,编写一个新方法,并使用访问器,甚至不想知道它们的详细操作。 - Nicolas Barbulesco
显示剩余4条评论

5

我认为这不是一种不好的做法,而是语言的一个特性。它不仅允许您以您想要的方式测试equals,而且在原型模式中用于对象创建也非常有用。


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

1

1

这很好并且完全正常。认为this可以操纵other的私有字段有点奇怪,但没关系,因为就算第三方能够干扰Odp对象的内部,也不会发生任何坏事。Odp类的任何方法都可以修改任何Odp对象的私有成员,甚至是非this对象的私有成员,但没关系,因为这样的方法显然是可以信任的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接