В верхнем ответе есть определение enum. Я хотел бы пример того, как это определенное перечисление будет использоваться в коде. Например, как определенный ctor будет использоваться для создания экземпляра enum с определенным целочисленным значением.
ScottF
@ ScottF, если бы я был тобой, вместо того, чтобы назначать награду за этот пост, я бы предпочел опубликовать совершенно новый вопрос ..... или прочитать документацию о перечислениях. Кажется, вам нужно понять некоторые основные знания об этом;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
г-н Оскар
Ответы:
307
Перечисления Java не похожи на перечисления C или C ++, которые на самом деле являются просто метками для целых чисел.
Перечисления Java реализованы больше как классы - и они могут даже иметь несколько атрибутов.
Исходя из вашего утверждения, лучше всего будет использовать java для создания перечисления последовательных целых чисел (аналогично перечислению C ++) для индекса в массиве или чего-то такого: enum Ids {NAME (0), AGE (1) ), ВЫСОТА (2), ВЕС (3); } Спасибо, -бн
бн.
Возможно, и особенно если вы когда-нибудь где-нибудь сериализуете интегральные значения.
Лавинио
1
Подскажите, пожалуйста, как использовать это перечисление в функции?
Ошибки происходят
2
Ленивым стандартам Java не разрешено устанавливать значение для перечисления. По крайней мере, c # позволяет это И является тип-безопасным.
Ксмит
2
FWIW, C ++ 11 теперь имеет безопасный тип enum class.
Феникс
93
Да. Вы можете передать числовые значения в конструктор для перечисления, например так:
Прохладно. Можно ли смешивать? Т.е. присваивать только номера выбранным значениям Enum.
Фредерик Норд
закрытый модификатор избыточен для конструкторов перечислений
Нино ван
@FrederickNord - Конечно. Просто добавьте второй приватный конструктор без аргументов, который инициализируется value(скажем) нулем. Затем включите (скажем) DANCEв список значений.
Обратите внимание, что эти два способа используют меньше памяти и больше единиц обработки. Я не говорю, что это лучший способ, но это просто другой подход.
Почему getColorValue()синхронизируется во втором примере?
josaphatv
@josaphatv Все функции во втором примере статичны и никогда не меняются. Вы можете захотеть HL_COLORS.getColorValue(HL_COLORS.YELLOW);без инициализации enum.
мазунки
11
Если вы используете очень большие типы enum, то может быть полезно следующее;
Функция ordinal () возвращает относительную позицию идентификатора в перечислении. Вы можете использовать это для получения автоматической индексации со смещением, как с перечислением в стиле C.
Редактировать: только что понял, что это очень похоже на ответ ggrandes , но я оставлю его здесь, потому что он очень чистый и как можно ближе к перечислению в стиле C.
В примере вы берете enum и получаете int. Можете ли вы показать обратное, взять int и получить перечисление (без явного регистра переключателя для каждого значения?)
ScottF
Что касается вопроса, я считаю, что это самый подходящий ответ. Здесь мы изменили индекс enum по умолчанию, чтобы он начинался со 100, не определяя новую переменную и не назначая их через конструктор.
Рахул Джайн
@RahulJain Я бы лучше использовал принятый ответ. Мне кажется, чище.
lealceldeiro
1
@scottf
Перечисление похоже на синглтон. JVM создает экземпляр.
Если бы вы создали его самостоятельно с помощью классов, это могло бы выглядеть так
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
И может быть использовано так:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid main(String[]args){System.out.println(MyEnum.ONE);System.out.println(MyEnum.TWO);System.out.println(MyEnum.ONE ==MyEnum.ONE);System.out.println("Hello World");}}
@scottf, вы, вероятно, запутались из-за конструктора, определенного в ENUM.
Позвольте мне объяснить это.
Когда class loaderзагружается enumкласс, enumвызывается также конструктор. На что!! Да, это называется OPENи close. С какими ценностями 100для OPENи 200дляclose
Но это плохая практика. enumиспользуется для представления constantsкак days of week, colors in rainbowто есть такой небольшой группы предопределенных констант.
enum ids {OPEN = 100, CLOSE};
?Ответы:
Перечисления Java не похожи на перечисления C или C ++, которые на самом деле являются просто метками для целых чисел.
Перечисления Java реализованы больше как классы - и они могут даже иметь несколько атрибутов.
Большая разница в том, что они безопасны от типов что означает, что вам не нужно беспокоиться о назначении перечисления COLOR для переменной SIZE.
См. Http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html для получения дополнительной информации.
источник
enum class
.Да. Вы можете передать числовые значения в конструктор для перечисления, например так:
Смотрите Sun Java Language Guide для получения дополнительной информации.
источник
value
(скажем) нулем. Затем включите (скажем)DANCE
в список значений.как насчет использования этого способа:
есть только один метод ..
Вы можете использовать статический метод и передать Enum в качестве параметра, например:
Обратите внимание, что эти два способа используют меньше памяти и больше единиц обработки. Я не говорю, что это лучший способ, но это просто другой подход.
источник
getColorValue()
синхронизируется во втором примере?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
без инициализации enum.Если вы используете очень большие типы enum, то может быть полезно следующее;
источник
Если вы хотите эмулировать перечисление C / C ++ (базовые числа и инкременты nexts):
источник
Функция ordinal () возвращает относительную позицию идентификатора в перечислении. Вы можете использовать это для получения автоматической индексации со смещением, как с перечислением в стиле C.
Пример:
Дает вывод:
Редактировать: только что понял, что это очень похоже на ответ ggrandes , но я оставлю его здесь, потому что он очень чистый и как можно ближе к перечислению в стиле C.
источник
@scottf
Перечисление похоже на синглтон. JVM создает экземпляр.
Если бы вы создали его самостоятельно с помощью классов, это могло бы выглядеть так
И может быть использовано так:
источник
@scottf, вы, вероятно, запутались из-за конструктора, определенного в ENUM.
Позвольте мне объяснить это.
Когда
class loader
загружаетсяenum
класс,enum
вызывается также конструктор. На что!! Да, это называетсяOPEN
иclose
. С какими ценностями100
дляOPEN
и200
дляclose
Могу ли я иметь другое значение?
Да,
Но это плохая практика.
enum
используется для представленияconstants
какdays of week
,colors in rainbow
то есть такой небольшой группы предопределенных констант.источник
Я думаю, вы смущены, глядя на счетчики C ++. Перечислители Java разные.
Это будет код, если вы привыкли к перечислениям C / C ++:
источник