Java(進階) - 如何比較實質相等性
看起來是進階的資訊,本想說看看就好,但又覺得是個重要觀念,所以就整理一下,當個參考:
1. 要用Override,而非用Overload。
2. 也要Override hashCode()方法。因文中提及官方文件中對hashCode()說明(節錄文中):
在Java中,Object Class中的equals()方法,就等於==。
=> 因而,我們需要自己去Override,以比較實質相等性。
要達到實質相等性,需以下條件:
1. 要用Override,而非用Overload。
2. 也要Override hashCode()方法。因文中提及官方文件中對hashCode()說明(節錄文中):
- 在同一個應用程式執行期間,對同一物件呼叫 hashCode()方法,必須回傳相同的整數結果。
- 如果兩個物件使用equals(Object)測試結果為相等, 則這兩個物件呼叫hashCode()時,必須獲得相同的整數結果。
- 如果兩個物件使用equals(Object)測試結果為不相等, 則這兩個物件呼叫hashCode()時,可以獲得不同的整數結果。
3. 如果考慮到繼承關係,不同類別的instance,應該視為不同物件。如:文中提到2D點類別(父類別)和3D點類別(子類別)不可相比。
4. 因可能會有建立過匿名類別物件情形,需要Override canEquals()方法,用來「反過來看傳入的instance,去取得this型態,進行測試」=> 用來解決因第2點中equals()有檢查「傳入instance一定要是子類別的instance」的限制。因匿名類別物件是屬於父類別的型態,所以用canEquals()解決第2點造成的限制。
留言
張貼留言