簡體   English   中英

有效的Java Item 9,CaseInsensitiveString示例是否正確?

[英]Effective Java Item 9, is the CaseInsensitiveString example correct?

我正在閱讀本書的第二版,第36頁。我不了解simmetry問題的解決方案:

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

如果我有CaseInsensitiveString cis= new CaseInsensitiveString("hello")String s="hello"則表現為非對稱方式,因為s.equals(cis)為true,但cis.equals(s)為false ...

我錯過了什么?

解決方案是正確的,因為不違反對稱性。 關於s.equals(cis)你是錯的。 它將在任何情況下返回false ,因為String內部測試另一個對象是否也是instanceof 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 ,請使用this.getClass() == o.getClass()而不是instanceof進行equals(Object)類型檢查!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM