Сравнение членов перечисления Java: == или equals ()?

Это невозможно, потому что toString () of A переопределяется B (думаю, вы имели в виду, что «класс B расширяет A»).

1580
задан GURMEET SINGH 15 October 2017 в 08:45
поделиться

4 ответа

Оба технически правильны. Если вы посмотрите исходный код для .equals () , он просто будет относиться к == .

Я использую == , однако, как это будет нулевым.

1473
ответ дан 22 November 2019 в 20:13
поделиться

В случае перечисления оба правильные и правильные !!

10
ответ дан 22 November 2019 в 20:13
поделиться

Использование == для сравнения двух значений перечисления работает, потому что существует только один объект для каждой константы перечисления.

Кстати, на самом деле нет необходимости использовать == для написания нулевого безопасного кода, если вы напишете свой equals () следующим образом:

public useEnums(final SomeEnum a) {
    if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
        …
    }
    …
}

Это лучший метод, известный как Сравнить константы слева , который вы определенно должен последовать.

83
ответ дан 22 November 2019 в 20:13
поделиться

Можно ли использовать == в enum?

Да: перечисления имеют жесткий контроль экземпляров, что позволяет использовать == для сравнения экземпляров. Вот гарантия, предоставляемая спецификацией языка (выделено мной):

JLS 8.9 Enums

Тип enum не имеет других экземпляров, кроме тех, которые определены его константами enum.

Попытка явного инстанцирования типа enum является ошибкой времени компиляции. Метод final clone в Enum гарантирует, что константы enum никогда не могут быть клонированы, а специальная обработка механизмом сериализации гарантирует, что дублирующие экземпляры никогда не будут созданы в результате десериализации. Отражательное инстанцирование типов enum запрещено. Вместе эти четыре вещи гарантируют, что не существует никаких экземпляров типа enum, кроме тех, которые определены константами enum.

Поскольку существует только один экземпляр каждой константы enum, допустимо использовать оператор == вместо метода equals при сравнении двух ссылок на объекты, если известно, что хотя бы одна из них относится к константе enum. (Метод equals в Enum является final методом, который просто вызывает super.equals на своем аргументе и возвращает результат, выполняя таким образом сравнение тождества. )

Эта гарантия достаточно сильна, чтобы Джош Блох рекомендовал, что если вы настаиваете на использовании паттерна singleton, то лучшим способом его реализации является использование одноэлементного enum (см.: Effective Java 2nd Edition, Item 3: Обеспечение свойства singleton с помощью приватного конструктора или типа enum; также Безопасность потоков в Singleton)


Каковы различия между == и equals?

В качестве напоминания следует сказать, что в общем случае == НЕ является жизнеспособной альтернативой equals. Однако, когда это происходит (например, с enum), необходимо учитывать два важных различия:

== никогда не бросает NullPointerException

enum Color { BLACK, WHITE };

Color nothing = null;
if (nothing == Color.BLACK);      // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException

== подлежит проверке на совместимость типов во время компиляции

enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };

if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT);      // DOESN'T COMPILE!!! Incompatible types!

Следует ли использовать ==, когда это применимо?

Блох специально упоминает, что неизменяемые классы, которые имеют надлежащий контроль над своими экземплярами, могут гарантировать своим клиентам, что == пригоден для использования. enum специально упоминается в качестве примера.

Пункт 1: Рассмотрите статические методы фабрики вместо конструкторов

[...] это позволяет неизменяемому классу гарантировать, что не существует двух одинаковых экземпляров: a.equals(b) тогда и только тогда, когда a==b. Если класс дает такую гарантию, то его клиенты могут использовать оператор == вместо метода equals(Object), что может привести к повышению производительности. Типы Enum обеспечивают такую гарантию.

Подводя итог, аргументы в пользу использования == на enum следующие:

  • Это работает.
  • Это быстрее.
  • Это безопаснее во время выполнения.
  • Безопаснее во время компиляции.
1063
ответ дан 22 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

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