![](/img/trans.png)
[英]Item 9 (equals contract) from Effective Java: is the example correct?
[英]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)
為false
且cis.equals(s)
為false
,給出對稱性。
關於instanceof
旁注
請注意, String#equals(Object o)
使用o instanceof String
來檢查其參數的類型。 這只是正確的,因為String
是final
,不能被子類化! 否則我們可以寫一個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.