То, почему Java не позволяет переопределять, равняется (Объект) в Перечислении?

Я заметил что следующий отрывок...

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

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

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

38
задан aioobe 26 August 2011 в 09:05
поделиться

4 ответа

Все, что угодно, кроме вернуть this == other , противоречит интуиции и нарушает принцип наименьшего удивления . Предполагается, что две константы перечисления будут равны тогда и только тогда, когда они являются одним и тем же объектом, и возможность переопределения этого поведения может привести к ошибкам.

Те же рассуждения применимы к hashCode () , clone () , compareTo (Object) , name () , ] ordinal () и getDeclaringClass () .


JLS не мотивирует выбор сделать его окончательным, но упоминает равенства в контексте перечислений здесь . Фрагмент:

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

41
ответ дан 27 November 2019 в 03:50
поделиться

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

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

0
ответ дан 27 November 2019 в 03:50
поделиться

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

3
ответ дан 27 November 2019 в 03:50
поделиться

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

1
ответ дан 27 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: