2015-03-23 4 views
7

Пожалуйста, посмотрите на это link Эффективной Java Joshua Bloch.Метод равенства в Эффективной Java Joshua Bloch

Во втором абзаце, автор говорит:

Класса является частным или частного пакетом, и вы уверены, что его метод равно никогда не будет вызываться. Можно утверждать, что equals метод должен быть переопределен в этих условиях, в случае, если он случайно вызывается:

@Override public boolean equals(Object o) { 
    throw new AssertionError(); // Method is never called 
} 

Пожалуйста, объясните это. Я смущаюсь тем, что автор использует термин private class, и почему возникает необходимость переопределить метод equals, когда мы точно знаем, что он не будет вызван.

+1

Невозможно получить доступ к этой странице. Сообщите важную часть. –

+0

Сэр, вот еще одна ссылка на эту статью http: //jtechies.blogspot.in/2012/07/item-8-obey-general-contract-when.html \ – user961690

+2

Вы: * «когда мы точно знаем, что это не будет вызываться "*; Джошуа Блох: * «если он случайно вызван» *. У вас есть другой вопрос? – Tom

ответ

8

Класс может быть закрытым только в том случае, если это внутренний класс.

Что касается «почему» существует необходимость переопределить equals, причина в том, что, написав это, как вы показали, вы будете обеспечить что метод никогда не вызывается преднамеренно. В тот момент, когда шесть месяцев в будущем, когда новый разработчик в проекте будет называть равным по этому классу, метод будет вызывать и сигнализировать о неправильном его вызове. Это хорошая вещь; он предотвращает «забывание» об этом.

+1

Ваше первое утверждение неточно. Мало того, что класс не должен быть внутренним (вложенные классы могут быть частными), но он также может быть классом верхнего уровня в том же компиляционном блоке, что и другой класс. – chrylis

+0

Вы правильно относитесь к вложенным классам; Я написал «внутреннее», но я имел в виду и то, и другое. Однако я не могу заставить вашу вторую работу работать: [this gist] (https://gist.github.com/andreabergia/6aeb123b7474a5822ef6) при сохранении как MainClass.java, похоже, не компилируется. –

+0

Цитата из указанной книги * «private или package-private» *, поэтому здесь также применяется пакетный класс верхнего уровня в том же компиляционном блоке. – Radiodef

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

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