![](/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.