Это невозможно, потому что toString () of A переопределяется B (думаю, вы имели в виду, что «класс B расширяет A»).
Оба технически правильны. Если вы посмотрите исходный код для .equals ()
, он просто будет относиться к ==
.
Я использую ==
, однако, как это будет нулевым.
В случае перечисления оба правильные и правильные !!
Использование ==
для сравнения двух значений перечисления работает, потому что существует только один объект для каждой константы перечисления.
Кстати, на самом деле нет необходимости использовать ==
для написания нулевого безопасного кода, если вы напишете свой equals ()
следующим образом:
public useEnums(final SomeEnum a) {
if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
…
}
…
}
Это лучший метод, известный как Сравнить константы слева , который вы определенно должен последовать.
==
в 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
следующие: