2013-11-22 1 views
4

Я читаю второе издание книги, страница 36. Я не понимаю, решение этой проблемы: симметриюЭффективный Java Item 9, является ли пример CaseInsensitiveString правильным?

@override public boolean equals(Object o) { 
    return o instanceof CaseInsensitiveString && 
     ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
} 

Если у меня есть и String s="hello" это ведет себя в несимметричных образом, потому что s.equals(cis) верно, но cis.equals(s) ложна ...

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

+1

Вы действительно пробовали 's.equals (cis)'? – chrylis

+0

Просьба поделиться, как метод 'equals()' переопределяется в 'CaseInsensitiveString'. Вероятно, это связано с тем, что – Savv

ответ

9

Решение правильное, поскольку симметрия не нарушена. Вы ошибаетесь в отношении s.equals(cis). Он вернет false в любом случае, поскольку String внутренне проверяет, является ли другой объект также экземпляром String и возвращает false, если нет. (И CaseInsensitiveString делает не простираться String.)

Итак, как s.equals(cis) является false и cis.equals(s) является false, симметрия задается.

Sidenote о 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)!

+0

Да, я пропустил это в примере CaseInsensitiveString не расширяет String ... Большое спасибо. – CptWasp

+0

@ user3022586 Да, в этом суть. Я добавил ссылку для решения этой проблемы. – isnot2bad

 Смежные вопросы

  • Нет связанных вопросов^_^