Элементы enum-а
компилируются в статические константы-экземпляры его класса. Экземпляры гарантированно
синглтоны. Это значит, для их сравнения безопасно использовать
==, даже после десериализации и в многопоточной среде.
Скомпилированный класс неявно наследуется от
java.lang.Enum, в котором все
методы из Object кроме
toString объявлены финальными. В частности, невозможно изменить поведение метода
equals – он сравнивает enum-ы с помощью
==. Так что
equals тоже можно использовать без опаски.
Но помимо этого есть несколько отличий
в пользу ==:
1. == не выбросит
NullPointerException. Прежде чем вызывать equals у переменной, придется удостовериться что она не null.
2. == не позволит сравнить объекты разных типов. Оператор еще на этапе компиляции подскажет, что такое сравнение не имеет смысла.
equals же будет принимать аргумент под типом
Object, и всегда возвращать
false уже в рантайме.
3. == быстрее. Скорее всего разница в производительности будет незаметной, но тем не менее, оператор не требует лишнего вызова метода.