繁体   English   中英

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

[英]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)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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM