我正在读这本书的第二版,第 36 页。我不明白对称性问题的解决方案:
@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)
是真的,但是 cis.equals(s)
是假的...
我错过了什么?
最佳答案
解是正确的,因为没有违反对称性。关于 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
作为类型 checkin equals(Object)
!
关于java - Effective Java Item 9,CaseInsensitiveString 示例是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150171/