2013-11-22 27 views
4

我在讀這本書的第二版,第36頁。我不明白的解決simmetry問題:Effective Java Item 9,CaseInsensitiveString示例是否正確?

@override public boolean equals(Object o) { 
    return o instanceof CaseInsensitiveString && 
     ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
} 

如果我有和String s="hello"這表現在非對稱的方式,因爲s.equals(cis) 是真實的,但cis.equals(s) 是假的......

我缺少什麼?

+1

你真的嘗試過's.equals(cis)'嗎? – chrylis

+0

請分享在'CaseInsensitiveString'中如何覆蓋'equals()'方法。這可能與此有關 – Savv

回答

9

該解決方案是正確的,因爲不違反對稱性。你錯了s.equals(cis)。在任何情況下,它將返回false,因爲String內部測試如果另一個對象也是String的實例並且如果不是則返回false。 (和CaseInsensitiveString延長String

那麼作爲s.equals(cis)falsecis.equals(s)false,對稱性給出。

旁註約instanceof

注意String#equals(Object o)使用o instanceof String檢查其參數的類型。這只是正確的,因爲Stringfinal,不能被分類!否則,我們可以寫的String一個子類,下面會發生:

String s = "Hello"; 
SubclassOfString sos = new SubclassOfString("Hello"); 
s.equals(sos) == true // as sos is instanceof String 
sos.equals(s) == false // as s is NOT instanceof SubclassOfString 

所以,如果你的類不是final,在equals(Object)使用this.getClass() == o.getClass()代替instanceof進行類型檢查!

+0

是的,我錯過了CaseInsensitiveString不擴展字符串的例子...非常感謝。 – CptWasp

+0

@ user3022586是的,就是這一點。我已經添加了一個旁註來解決這個問題。 – isnot2bad