- Can we have integers as elements of an enum in Java?
- Integers as elements of an enum
- Example
- Output
- Example
- Output
- Enums with numbers
- Перечисления в Java (java enum)
- Конструкция enum
- Перечисление — это класс
- Элементы перечисления — экземпляры enum -класса, доступные статически
- Название и порядковый номер элемента enum
- Декомпилированный enum-class с наследованием
- Перечисления и параметрический полиморфизм
Can we have integers as elements of an enum in Java?
Enumeration (enum) in Java is a datatype which stores a set of constant values. You can use enumerations to store fixed values such as days in a week, months in a year etc.
You can define an enumeration using the keyword enum followed by the name of the enumeration as −
Just like arrays, the elements/constants in an enumeration are identified using numbers starting from 0 in the above example the days are identified using numbers as shown in the following illustration −
Integers as elements of an enum
No, we can have only strings as elements in an enumeration. Using strings in it, generates a compile time error.
Example
In the following java example, we are trying to have 3 integer values as elements of an enum.
Output
EnumTest.java:1: error: expected enum EnumTest < ^ EnumTest.java:2: error: ',', '>', or ';' expected 10024, 5336, 9987 ^ EnumTest.java:2: error: '>' expected 10024, 5336, 9987 ^ 3 errors
Instead you can have integer values to the elements of an enum.
Example
enum StudentMarks < //Constants with values Krishna(86), Katyayani(75), Bhanu(89), Bhargav(70), Lata(90); //Instance variable private int marks; //Constructor to initialize the instance variable StudentMarks(int marks) < this.marks = marks; >public static void getMarks(int model) < StudentMarks marks[] = StudentMarks.values(); System.out.println("Price of: "+marks[model]+" is "+marks[model].marks); >> public class Sample < public static void main(String args[])< StudentMarks m[] = StudentMarks.values(); for(int i = 0; i> >
Output
Price of: Krishna is 86 Price of: Katyayani is 75 Price of: Bhanu is 89 Price of: Bhargav is 70 Price of: Lata is 90
Enums with numbers
posted 14 years ago
how do I define an enum of number & non alpha characters. For e.g. if I want to define an enum of 1,2 & 3 I thought I could do the following
I know that I could define strings with these values as follows
but that does seem right either. What are the rules about what an enum value can have?
Bartender
posted 14 years ago
Sheriff
posted 14 years ago
As Steve said above, enum identifiers follow the same rules as other Java identifiers. By convention, enum identifiers are typically all uppercase.
But I’m not sure if that’s what you’re asking.
Note that each Enum instance has an int ordinal that represents the Enum’s «position in its enum declaration, where the initial constant is assigned an ordinal of zero.» This value is returned by the method ordinal(). For details, see the API documentation for java.lang.Enum.
Additionally, you can add data and behavior to your Enums. See this Enums article for details (note the Planet example about half way through).
«We’re kind of on the level of crossword puzzle writers. And no one ever goes to them and gives them an award.» ~Joe Strummer
sscce.org
Перечисления в Java (java enum)
Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году – 12, а время года – 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных – перечисление ( enum ). В Java перечисление появилось не сразу. Специализированная языковая конструкция enum была введена начиная с версии 1.5. До этого момента программисты использовали другие методы для реализации перечислений.
Конструкция enum
Season season = Season.SPRING; if (season == Season.SPRING) season = Season.SUMMER; System.out.println(season);
В результате выполнения которого на консоль будет выведено SUMMER. Думаю, что пример очевиден и в пояснениях не нуждается.
Перечисление — это класс
Объявляя enum мы неявно создаем класс производный от java.lang.Enum . Условно конструкция enum Season < . >эквивалентна class Season extends java.lang.Enum < . >. И хотя явным образом наследоваться от java.lang.Enum нам не позволяет компилятор, все же в том, что enum наследуется, легко убедиться с помощью reflection :
System.out.println(Season.class.getSuperclass());
Собственно наследование за нас автоматически выполняет компилятор Java. Далее давайте условимся называть класс, созданный компилятором для реализации перечисления — enum -классом, а возможные значения перечисляемого типа — элементами enum -a.
Элементы перечисления — экземпляры enum -класса, доступные статически
Элементы enum Season (WINTER, SPRING и т.д.) — это статически доступные экземпляры enum -класса Season . Их статическая доступность позволяет нам выполнять сравнение с помощью оператора сравнения ссылок == . Пример:
Season season = Season.SUMMER; if (season == Season.AUTUMN) season = Season.WINTER;
Название и порядковый номер элемента enum
Как уже было сказано ранее любой enum -класс наследует java.lang.Enum , который содержит ряд методов полезных для всех перечислений. Пример:
Season season = Season.WINTER; System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal() lang-java line-numbers"> season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Здесь показано использования методов name() , toString() и ordinal() . Семантика методов — очевидна. Следует обратить внимание, что данные методы enum -класс наследует из класса java.lang.Enum . Получение элемента enum по строковому представлению его имениДовольно часто возникает задача получить элемент enum по его строковому представлению. Для этих целей в каждом enum -классе компилятор автоматически создает специальный статический метод: public static EnumClass valueOf(String name) , который возвращает элемент перечисления EnumClass с названием, равным name . Пример использования:
String name = "WINTER"; Season season = Season.valueOf(name);
В результате выполнения кода переменная season будет равна Season.WINTER . Cледует обратить внимание, что если элемент не будет найден, то будет выброшен IllegalArgumentException, а в случае, если name равен null — NullPointerException. Об этом, кстати, часто забывают. Почему-то многие твердо уверенны, что если функция принимает один аргумент и при некоторых условиях выбрасывает IllegalArgumentException, то при передачи туда null , также будет непременно выброшен IllegalArgumentException. Но это не относится к делу. Продолжим. Получение всех элементов перечисления Иногда необходимо получить список всех элементов enum -класса во время выполнения. Для этих целей в каждом enum -классе компилятор создает метод public static EnumClass[] values() . Пример использования:
System.out.println(Arrays.toString(Season.values()));
[WINTER, SPRING, SUMMER, AUTUMN]
Обратите внимание, что ни метод valueOf() , ни метод values() не определен в классе java.lang.Enum . Вместо этого они автоматически добавляются компилятором на этапе компиляции enum -класса. Добавляем свои методы в enum -класс У Вас есть возможность добавлять собственные методы как в enum -класс, так и в его элементы: То же, но с полиморфизмом:
Последний пример демонстрирует использование наследования в enum . Об этом — далее. Наследование в enum С помощью enum в Java можно реализовать иерархию классов, объекты которой создаются в единственном экземпляре и доступны статически. При этом элементы enum могут содержать собственные конструкторы. Приведем пример:
Здесь объявляется перечисление Type с тремя элементами INT , INTEGER и STRING . Компилятор создаст следующие классы и объекты:
- Type — класс производный от java.lang.Enum
- INT — объект 1-го класса производного от Type
- INTEGER — объект 2-го класса производного от Type
- STRING — объект 3-го класса производного от Type
Три производных класса будут созданы с полиморфным методом Object parse(String) и конструктором Type(. boolean) . При этом объекты классов INT , INTEGER и STRING существуют в единственном экземпляре и доступны статически. В этом можно убедится:
System.out.println(Type.class); System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass()); System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass()); System.out.println(Type.STRING.getClass() + " " + Type.STRING.getClass().getSuperclass());
class Type class Type$1 class Type class Type$2 class Type class Type$3 class Type
Декомпилированный enum-class с наследованием
В подтверждение вышесказанному приведем еще результат декомпиляции перечисления Type из примера выше:
Перечисления и параметрический полиморфизм
У читателя может возникнуть вопрос: "почему вышеуказанное перечисление Type не использует генерики (generics)?". Дело в том, что в Java использование генериков в enum запрещено. Так следующий пример не скомпилируется: