2010-06-03 4 views
33

Я заметил, что следующий фрагмент ...Почему Java не разрешает переопределять равные (Object) в Enum?

@Override 
public boolean equals(Object otherObject) { 
    ... 
} 

... не допускается для Enum, так как метод equals(Object x) определяется как final в Enum. Почему это так?

Я не могу придумать какой-либо прецедент, который потребует переопределения equals(Object) для Enum. Мне просто интересно узнать, что такое поведение.

ответ

33

ничего, кроме return this == other будет противостоять интуитивно понятным и нарушить the principle of least astonishment. Ожидается, что две константы перечисления будут equal тогда и только тогда, когда они являются одним и тем же объектом, и возможность переопределить это поведение будет подвержена ошибкам.

То же рассуждение относится и к hashCode(), clone(), compareTo(Object), name(), ordinal() и getDeclaringClass().


Хотя JLS не мотивируют выбор делает его окончательным, но упоминает равных в контексте перечислений here. Snippet:

равенство метод в Enum является последним методом, который просто вызывает super.equals на его аргумент и возвращает результат, таким образом, выполняя сравнение идентичности.

0

Именно поэтому разработчики Java не могли придумать какой-либо мыслимый вариант использования для переопределения Enum.equals (Object), что этот метод объявлен как final - так что такое переопределение было бы невозможным.

3

Уже существует сильное интуитивное представление о том, что означает для экземпляров (значений) enum равными. Разрешение перегрузки метода equals приведет к нарушению этого понятия, что приведет к неожиданному поведению, ошибкам и т. Д.

0

Я должен признаться, перечисления это последнее, что я хотел бы переопределить equals() в.

Я думаю, что причина equals() является окончательной в перечислениях является то, что Java поддерживает == для сравнения перечислений, а также реализация equals() в перечислениях просто использует его, поэтому разрешение equals() заключается в том, чтобы предотвратить == и equals() от поведения по-другому, чего не ожидали бы другие разработчики.

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

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