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

Posted

技术标签:

【中文标题】Java:直接从同一类的另一个实例访问私有字段【英文标题】:Java: Accessing private fields directly from another instance of the same class 【发布时间】:2010-12-05 15:41:31 【问题描述】:

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

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


我可以直接访问该字段:

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


这是不好的做法吗?

【问题讨论】:

可能不是完全相同但非常接近:***.com/questions/1540159/… 【参考方案1】:

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

【讨论】:

+1 如果出于某种原因可以将“集合”重命名为更清晰的状态,我宁愿在一个地方更改它,而不是在每个使用 getter 的地方。【参考方案2】:

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

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

【讨论】:

仅仅因为它会在 99% 的时间内工作并不意味着它是正确的做法。它打破了封装并将类更紧密地结合在一起,除了节省键入五个字符之外没有其他原因。请看我的回答。 “将类更紧密地结合在一起” - 哪些类?这里只涉及一个类,您不能将一个类与其自身“解耦”。 不一定。传递给 equals() 的参数不一定是完全相同的类。 我不同意这个答案。最好使用访问器。 访问器可能会做一些特殊的操作,比如克隆……当你直接访问一个字段时,你会绕过这些。这打破了访问者的目标。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

这是重复的

Why can I access my private variables of the "other" object directly, in my equals(Object o) method

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于Java:直接从同一类的另一个实例访问私有字段的主要内容,如果未能解决你的问题,请参考以下文章

从同一类的不同实例访问私有方法

从子类访问父类的私有实例变量?

C ++通过访问器函数返回私有二维数组

为啥Java不允许我通过同一个类的方法访问私有方法?

java内部类可以访问外部类的静态方法吗

C++ - 如何从同一个类的静态函数访问一个类的私有成员?