Effective Java 學習筆記(8)

當重載equals方法時,遵循慣例.

equals不是每個類都必須重載,當以下幾個條件滿足,可以不重載equals.

1. 類的實例只有同一個才被判爲相等. 如Thread類.

2. 不用關心兩個對象是否邏輯相等的時候,或是說比較對象沒有意義.

3.父類已經重載了equals,而且父類的equals也適用於子類,子類就不用重載equals.

4.這是一個私有類或是包內訪問,你確定equals不會被調用.

那什麼時候使用equals呢,當兩個對象之間有邏輯相等的意義的時候,而其父類並沒有重載適合的equals的時候, 換句話說,也就是數據類. 這種類有比較值的需求, 而不是簡單的判斷是不是同一個對象.

然而,對實例化進行控制的數據類型對象,如singleton,不用重載equals.

重載要注意以下幾個原則:

反射,對稱,傳遞,一致

另外,對於null,一定要返回false.

高效的equals可以參考以下幾點.

1. 用==判斷是不是同一個實例.

2. 使用instanceof判斷是不是同一個類型.

3.強制轉化成正確的類型.

4.對每個有比較意義的成員變量都作檢查.

5.當你寫完之後,要問自己,這個函數是不是對稱的,可傳遞的,一致的.

寫完equals後,要注意:

1. 在重載equals後,必須要重載hashCode.

2. 不能簡單的比較一個field是不是相等. 如對File這對類,如果兩個對象打開的是相同內容的文件,此時不應該判斷爲相同.

3.不要用另一個類型來代替參數中的Object,否則這就不是重載.

錯誤例子:

public boolean equals(MyClass o) {
...
}

在編譯前使用@Override 可以使編譯器在不正確的函數簽名時報錯.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章