Перечисления — различия между версиями
Sergej (обсуждение | вклад) |
Sergej (обсуждение | вклад) (→Введение) |
||
Строка 2: | Строка 2: | ||
Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление <tex>(enum)</tex>. | Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление <tex>(enum)</tex>. | ||
==Введение == | ==Введение == | ||
− | В <tex>Java</tex>, начиная с версии 1.5, помимо всего прочего появились так называемые перечисления | + | В <tex>Java</tex>, начиная с версии 1.5, помимо всего прочего появились так называемые перечисления (enum). Существует целый ряд плюсов от использования перечислений против именованных констант: |
Компилятор гарантирует корректную проверку типов | Компилятор гарантирует корректную проверку типов | ||
Удобство итерации по всем возможным значениям перечисления | Удобство итерации по всем возможным значениям перечисления | ||
Строка 8: | Строка 8: | ||
и т.д. | и т.д. | ||
− | Однако по сравнению, допустим, с C++, перечисления в | + | Однако по сравнению, допустим, с C++, перечисления в Java представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. |
Во-первых, все перечисления наследуются от класса <tex>java.lang.Enum</tex>, у которого есть ряд удобных методов, а именно: | Во-первых, все перечисления наследуются от класса <tex>java.lang.Enum</tex>, у которого есть ряд удобных методов, а именно: | ||
Строка 21: | Строка 21: | ||
Перечисления могут реализовывать любые интерфейсы | Перечисления могут реализовывать любые интерфейсы | ||
При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные) | При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные) | ||
+ | |||
==Конструкция enum== | ==Конструкция enum== | ||
Начнем с примера. Давайте опишем с помощью enum тип данных для хранения времени года: | Начнем с примера. Давайте опишем с помощью enum тип данных для хранения времени года: |
Версия 17:23, 19 июня 2013
Предистория
Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление
.Введение
В
, начиная с версии 1.5, помимо всего прочего появились так называемые перечисления (enum). Существует целый ряд плюсов от использования перечислений против именованных констант: Компилятор гарантирует корректную проверку типов Удобство итерации по всем возможным значениям перечисления Они занимают меньше места в блоке (не нужно указывать имя класса) и т.д.Однако по сравнению, допустим, с C++, перечисления в Java представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. Во-первых, все перечисления наследуются от класса
, у которого есть ряд удобных методов, а именно:— имя константы в виде строки
— порядок константы (соответствует порядку, в котором объявлены константы)
— статический метод, позволяющий получить объект перечисления по классу и имени
Далее, как уже было озвучено, у класса перечисления есть возможность получить все возможные значения перечисления путем вызова метода
у класса перечисления В классе перечисления имеется возможность задавать конструкторы (только приватные), поля и методы Перечисления могут реализовывать любые интерфейсы При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные)Конструкция 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. Условно конструкция
Season { ... } эквивалентнаclass Season extends java.lang.Enum { ... }.
И хотя явным образом наследоваться от
нам не позволяет компилятор, все же в том, что наследуется, легко убедиться с помощьюSystem.out.println(Season.class.getSuperclass());
На консоль будет выведено:
class java.lang.Enum
Собственно наследование за нас автоматически выполняет компилятор Java.
Пример
Раньше класс бинарные операции мы делали вот так
public class BinaryOperation { public class Plus { public int calculate (int a, int b){ return a + b; } } public class Minus { public int calculate (int a, int b){ return a - b; } } public class Division { public int calculate (int a, int b){ return a / b; } } public class Times { public int calculate (int a, int b){ return a * b; } } }
Проблема была в том, что пригодилось делать много проверок извне для вызова этих функции. Можно сделать гораздо проще и удобнее
public enum BinaryOperation { Plus("+") { public int calculate(int a, int b){ return a + b; } } Minus("-") { public int calculate(int a, int b){ return a - b; } } Division("/") { public int calculate(int a, int b){ return a / b; } } Times("*") { public int calculate(int a, int b){ return a * b; } } } abstract public int calculate(int a, int b);
}