Как лучше сравнивать перечисляемые типы в Java

Недавно на Stack Overflow я наткнулся на, казалось бы, простой вопрос: «Что лучше использовать для сравнения enum’ов — == или equals()?». Вы, конечно, можете сходу ответить, что никакой разницы нет, но будете неправы — в ответах к этому вопросу было приведено много интересных аргументов в пользу обоих вариантов. Я решил, что будет интересно перевести этот спор на русский язык. Да. Как написано в документации, «допустимо использовать оператор == вместо метода equals, если доподлинно известно, что хотя бы один из них ссылается на перечислимый тип» («it is permissible to use the == operator in place of the equals method when comparing two object references if it is known that at least one of them refers to an enum constant»). Причина этого очень простая — каждый из объектов enum’а создаётся только единожды, и поэтому, если вы создадите десять переменных равных SomeEnum.RED, они все будут ссылаться на один и тот же объект (а оператор == как раз это и проверяет). Не спешите так. Не все единогласно за ==.