java - Effective Java Item 9,CaseInsensitiveString 示例是否正确?

标签 java effective-java

我正在读这本书的第二版,第 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)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 作为类型 checkin equals(Object)!

关于java - Effective Java Item 9,CaseInsensitiveString 示例是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150171/

相关文章:

java - BigDecimal 是可扩展的并且没有复制构造函数。这有安全风险吗?

java - 私有(private)函数应该如何做参数验证或者用户输入和内部数据结构?

java - 在核心 Java 中的其他相关类中共享不可变类的内部示例

java - 从数据库中检索值。如何从Action类设置为Action Form和JSP?

java - 通过私有(private)方法返回更新后的变量

java - Weblogic 11g : BEA-382513: OSB Replace action failed updating variable "body": {err}FORG0005: expected exactly one item, 获得 0 件商品

java - 为什么 Joshua Bloch 在有效 java 的 pop 方法中递减堆栈的 "size"值?

java - 为什么抑制这个未经检查的警告是安全的?

java - 插入时如何批量插入取决于准备批量的数据

java - 为带有附件的电子邮件设置多部分