Cpt*_*asp 4 java effective-java
我正在阅读本书的第二版,第36页.我不了解simmetry问题的解决方案:
@override public boolean equals(Object o) {
return o instanceof CaseInsensitiveString &&
((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}
Run Code Online (Sandbox Code Playgroud)
如果我有,CaseInsensitiveString cis= new CaseInsensitiveString("hello")并且String s="hello"这种行为是非对称的,因为s.equals(cis)
是真的,但是cis.equals(s)
是假的......
我错过了什么?
解决方案是正确的,因为不违反对称性.你错了s.equals(cis).如果另一个对象也是instanceof ,它将false在任何情况下作为String内部测试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
Run Code Online (Sandbox Code Playgroud)
因此,如果您的课程不是final,请使用this.getClass() == o.getClass()而不是instanceof进行类型检查equals(Object)!
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |