Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

в java перечисления не привязаны к числам???

витя сухоруков Ученик (44), закрыт 4 года назад
например есть перечисление

public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}

тут нет такого же как в си, т. е. SUNDAY = 0, MONDAY = 1 и т. д. (т.. е числа неявно присваиваются константам)??

Что если я хочу рандомно выбрать день недели?
например создаем

Day day;

затем рандомим число от 0 до 6

day = (int)(Math.random() * 7); тем самым выбирая рандомно день недели, почему так не получается?
Лучший ответ
Дед Мазай Гений (58109) 4 года назад
Выбор случайного дня:

Day day = Day.values()(Math.random() * 7);
Дед МазайГений (58109) 4 года назад
Перепутал скобки:

Day day = Day.values()[Math.random() * 7];
Остальные ответы
Сергей Левитин Мастер (2214) 4 года назад
Потому, что Java сделана так, а не иначе. Иначе бы в нашем мире все творилось, как хотело.

Цитирую:
Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году – 12, а время года – 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных – перечисление (enum). В Java перечисление появилось не сразу. Специализированная языковая конструкция enum была введена начиная с версии 1.5. До этого момента программисты использовали другие методы для реализации перечислений.

Конструкция enum
Начнем с примера. Давайте опишем с помощью enum тип данных для хранения времени года:

enum Season { WINTER, SPRING, SUMMER, AUTUMN }

Ну и простой пример его использования:

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());

На консоль будет выведено:

class java.lang.Enum

Собственно наследование за нас автоматически выполняет компилятор 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()=" + season.ordinal());

Будет выведено:

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. Но это не относится к делу.
Похожие вопросы