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

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) 是假的......

我错过了什么?

isn*_*bad 9

解决方案是正确的,因为不违反对称性.你错了s.equals(cis).如果另一个对象也是instanceof ,它将false在任何情况下作为String内部测试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
Run Code Online (Sandbox Code Playgroud)

因此,如果您的课程不是final,请使用this.getClass() == o.getClass()而不是instanceof进行类型检查equals(Object)!