學習effective java-8對所有對象共同的方法之覆寫equals方法時請遵從一般規約

該知識點是自己從書籍中學習的筆記

背景

 Ojbect的equals方法代表的是引用是否引用的同一對象的相等性測試。

在以下情況下,Object的equals方法是不必覆寫的:

ü  類的每個實例都是獨一無二的。比如說線程,線程代表的是活動實體而不是值。此時Object的equals方法足以是滿足該要求的。

ü  當用戶並不關心邏輯是上的相等性的時候,可以不覆寫equals方法。比如說一般情況下,當兩個學生有相同的名字和學號時,我們都會認爲是同一個人,但是有的人就認爲這是兩個不同的學生,那麼就必要覆寫equals方法。

ü  當父類的equals方法足夠滿足子類的比較時,就不需要覆寫equals方法。比如Set的大部份實現類都繼承調用了AbstractSet中的equals方法。

ü  如果類是私有的或者package-private的話,並且確認這些不會用來測試相等性的時候,就必須覆寫equals方法,如下:

@Override public boolean equals(Object o) {

throw new AssertionError(); // Method is never called

}

何時覆寫equals?

  當兩個對象有邏輯上的相等的時候。大部分都是針對類中的屬性來進行相等性比較的。

Object的equals方法的特性

  對於Object的equals方法的特性,請查看Java SE的文檔,上面說的幾條規則很清楚,必須遵守。

覆寫equals的注意

1.覆寫的equals方法是否滿足:對稱性、傳遞性、一致性。

2.覆寫了equals方法的同時,一定要覆寫hashCode()。

3.這樣寫public boolean equals(MyObject obj){}是錯誤的,這代表的是重載,而不是覆寫。裏面的參數類型不一樣。所以必須這樣public boolean equals(Object obj){}才正確。

 

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