Действующий элемент Java 9, правильный ли пример CaseInsensitiveString?

Читаю второе издание книги, стр. 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) ложно...

Что мне не хватает?


person CptWasp    schedule 22.11.2013    source источник
comment
Вы действительно пробовали s.equals(cis)?   -  person chrylis -cautiouslyoptimistic-    schedule 22.11.2013
comment
Расскажите, как переопределить метод equals() в CaseInsensitiveString. Наверное, это как-то связано с этим   -  person Savv    schedule 22.11.2013


Ответы (1)


Решение правильное, так как симметрия не нарушена. Вы ошибаетесь относительно s.equals(cis). В любом случае он вернет false, так как String внутренне проверяет, является ли другой объект также instanceof 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

Поэтому, если ваши классы не final, используйте this.getClass() == o.getClass() вместо instanceof для проверки типов в equals(Object)!

person isnot2bad    schedule 22.11.2013
comment
Да, я пропустил, что в примере CaseInsensitiveString не расширяет String... Большое спасибо. - person CptWasp; 22.11.2013
comment
@ user3022586 Да, в том-то и дело. Я добавил побочное примечание для решения этой проблемы. - person isnot2bad; 22.11.2013