簡體   English   中英

Java:直接從同一個類的另一個實例訪問私有字段

[英]Java: Accessing private fields directly from another instance of the same class

我正在為一個類編寫一個equals(Object obj)函數。 我看到可以從調用者訪問obj的私有字段。 所以不要使用getter:

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

}

我可以直接訪問該字段:

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

}

這是不好的做法嗎?

我傾向於總是使用吸氣劑,因為有時吸氣劑不僅僅是“返回(foo)”。 有時,如果它們為空,或者在其中包含一些調試日志,或者以某種方式驗證當前狀態,它們會初始化。 它更加一致。

不,這不對。 私有變量和方法無法從其他類訪問的原因是允許您更改類的內部,而無需更改使用該類的所有代碼(並且防止類的用戶例如設置變量)到一個它從未應該擁有的價值。

如果你使用其他對象的私有變量不會傷害任何東西,因為如果你重構你的類的內部,你必須改變類中的代碼。

我不認為這是不好的做法,而是語言的一個特點。 它不僅可以讓你測試equals你做的方式,但它也是在創建對象的原型模式是有用的。

這很好,完全正常。 認為this可以擺弄other的私人領域有點奇怪,但是沒關系,因為就某些第三方能夠使用Odp對象的內部結構而言,沒有任何不好的事情可以發生。 Odp類的任何方法都可以修改任何Odp對象的任何私有成員,即使不是這些也是this ,但這很好,因為任何這樣的方法顯然都可以信任!

這是重復的

為什么我可以在我的equals(Object o)方法中直接訪問“other”對象的私有變量

私有數據可由該類的任何實例訪問,即使A類的一個實例正在訪問另一個A實例的私有成員。重要的是要記住訪問修飾符(private,protected,public)是控制類訪問,而不是實例訪問

將私有成員用於實體類可能會導致代理類錯誤地工作。 想象一下,hibernate通過延遲查詢創建類。 如果檢查成員變量,則返回null。 但是如果你調用get(),它將從數據庫中獲取數據並初始化該字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM