2009-10-10 87 views
11

我正在爲一個類寫入equals(Object obj)函數。我看到可以從調用者訪問obj的專用字段。因此,而不是使用一個getter的:Java:直接從同一類的另一個實例訪問私有字段

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

} 

我就可以直接訪問現場:

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

} 

這是不好的做法?

+1

可能不是一個確切的重複,但非常接近:http://stackoverflow.com/questions/1540159/using-getters-or -using-direct-field-access-a-pojo – ChssPly76 2009-10-10 20:19:06

回答

6

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

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

+1

僅僅因爲它能夠工作99%的時間並不意味着它是正確的。除了保存輸入的五個字符之外,它打破了封裝並且更緊密地耦合了類,沒有其他原因。請看我的答案。 – 2009-10-11 04:21:27

+3

「將班級更緊密地結合在一起」 - 哪些班級?在這裏只有一個有關的課程,你不能「脫離」一個課程。 – sepp2k 2009-10-11 11:16:59

+1

不一定。傳遞給equals()的參數不一定是完全相同的類。 – 2009-10-13 14:04:57

9

我傾向於總是使用getter,因爲有時getter不僅僅是「return(foo)」。有時如果它們爲空,或者有一些調試日誌記錄或者以某種方式驗證當前狀態,它們就會初始化它們。它更一致。

+0

+1如果無論出於何種原因,「collection」可以是ren爲了更清楚地表明它的目的,我寧願在一個地方改變它,而不是每個吸氣劑都會被使用的地方。 – 2014-01-15 15:12:57

1

這很好,完全正常。有點奇怪,認爲this可以撥弄other的私人字段,但沒關係,因爲對於某些第三方能夠使用Odp對象的內部來說,沒有任何不好的事情會發生。 Odp類的任何方法都可以修改任何Odp對象的私有成員,即使不是this,但這很好,因爲任何此類方法顯然都可以信任!

5

我不認爲這是不好的做法,而是語言的一個特點。它不僅允許您測試equals的方式,而且它在創建對象的Prototype模式中也很有用。

0

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

相關問題