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

时间:2013-11-22 16:50:24

标签: java effective-java

我正在阅读本书的第二版,第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) 是的,但是cis.equals(s) 是假的......

我错过了什么?

1 个答案:

答案 0 :(得分:9)

解决方案是正确的,因为没有违反对称性。关于s.equals(cis),你错了。它将在任何情况下返回false,因为String内部测试其他对象是否也是String的实例,如果没有,则返回false。 (CaseInsensitiveString

因为Strings.equals(cis)falsecis.equals(s),所以给出了对称性。

关于false

的旁注

请注意instanceof使用String#equals(Object o)来检查其参数的类型。这只是正确的,因为o instanceof StringString并且不能被子类化!否则我们可以编写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中的类型检查!