Можно ли использовать ==
перечисления в Java или мне нужно использовать .equals()
? В моем тестировании ==
всегда работает, но я не уверен, что мне это гарантировано. В частности, .clone()
в перечислении нет метода, поэтому я не знаю, можно ли получить перечисление, для которого .equals()
возвращалось бы другое значение, чем ==
.
Например, это нормально:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Или мне нужно написать так:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Ответы:
Только мои 2 цента: вот код Enum.java, опубликованный Sun и являющийся частью JDK:
источник
Да, == в порядке - для каждого значения гарантированно будет только одна ссылка.
Однако есть лучший способ написать свой круглый метод:
Еще лучший способ сделать это - поместить функциональность в само перечисление, чтобы вы могли просто вызвать
roundingMode.round(someValue)
. Это затрагивает суть перечислений Java - они объектно-ориентированные перечисления, в отличие от «именованных значений», которые можно найти где-либо еще.РЕДАКТИРОВАТЬ: спецификация не очень ясна, но в разделе 8.9 говорится:
источник
Да, это как если бы вы создали экземпляры singleton для каждого значения в перечислении:
Тем не менее , то
enum
конструкция дает различные преимущества:switch-case
структуры управления.values
поля, которое «сгенерировано» для каждого типа перечисления.Сериализация - большая проблема. Если бы я использовал приведенный выше код вместо перечисления, вот как ведет себя равенство идентичности:
Вы можете решить эту проблему без перечисления, используя технику, которая включает
writeReplace
иreadResolve
(см. Http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...Думаю, дело в том, что Java делает все возможное, чтобы позволить вам использовать идентификаторы значений перечисления для проверки равенства; это рекомендуемая практика.
источник
== сравнивает ссылки двух объектов. Для перечислений гарантируется, что будет только один экземпляр, и поэтому для любых двух одинаковых перечислений == будет истинным.
Ссылка:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(ничего не нашел в документации Sun)
источник
Вот какой-то злой код, который может вас заинтересовать. : D
источник
Unsafe.class
.Перечисления - отличное место для застревания полиморфного кода.
источник
Обратите внимание, что при передаче enum через RMI / IIOP возникает проблема. Смотрите эту ветку:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
источник
== в целом нормально, но есть преимущества как у ==, так и у
.equals()
. Я лично предпочитаю всегда использовать.equals()
при сравнении объектов, включаяenum
s. См. Также это обсуждение:Сравнение элементов перечисления Java: == или equals ()?
источник