Перечисления — различия между версиями
Sergej (обсуждение | вклад) (→Пример) |
Sergej (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | ==Введение == | ||
+ | В <tex>Java</tex>, начиная с версии 1.5, помимо всего прочего появились так называемые перечисления <tex>(enum)</tex>. Существует целый ряд плюсов от использования перечислений против именованных констант: | ||
+ | Компилятор гарантирует корректную проверку типов | ||
+ | Удобство итерации по всем возможным значениям перечисления | ||
+ | Они занимают меньше места в <tex>switch-</tex>блоке (не нужно указывать имя класса) | ||
+ | и т.д. | ||
+ | |||
+ | Однако по сравнению, допустим, с <tex>C++</tex>, перечисления в <tex>Java</tex> представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. | ||
+ | Во-первых, все перечисления наследуются от класса <tex>java.lang.Enum</tex>, у которого есть ряд удобных методов, а именно: | ||
+ | <tex>— name()</tex> — имя константы в виде строки | ||
+ | |||
+ | <tex>— ordinal()</tex> — порядок константы (соответствует порядку, в котором объявлены константы) | ||
+ | |||
+ | <tex>— valueOf()</tex> — статический метод, позволяющий получить объект перечисления по классу и имени | ||
+ | |||
+ | Далее, как уже было озвучено, у класса перечисления есть возможность получить все возможные значения перечисления путем вызова метода <tex>java.lang.Class.getEnumConstants()</tex> у класса перечисления | ||
+ | В классе перечисления имеется возможность задавать конструкторы (только приватные), поля и методы | ||
+ | Перечисления могут реализовывать любые интерфейсы | ||
+ | При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные) | ||
== Пример == | == Пример == | ||
Раньше класс бинарные операции мы делали вот так | Раньше класс бинарные операции мы делали вот так | ||
Строка 47: | Строка 66: | ||
} | } | ||
abstract public int calculate(int a, int b); | abstract public int calculate(int a, int b); | ||
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версия 16:45, 19 июня 2013
Введение
В
, начиная с версии 1.5, помимо всего прочего появились так называемые перечисления . Существует целый ряд плюсов от использования перечислений против именованных констант: Компилятор гарантирует корректную проверку типов Удобство итерации по всем возможным значениям перечисления Они занимают меньше места в блоке (не нужно указывать имя класса) и т.д.Однако по сравнению, допустим, с
, перечисления в представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. Во-первых, все перечисления наследуются от класса , у которого есть ряд удобных методов, а именно: — имя константы в виде строки— порядок константы (соответствует порядку, в котором объявлены константы)
— статический метод, позволяющий получить объект перечисления по классу и имени
Далее, как уже было озвучено, у класса перечисления есть возможность получить все возможные значения перечисления путем вызова метода
у класса перечисления В классе перечисления имеется возможность задавать конструкторы (только приватные), поля и методы Перечисления могут реализовывать любые интерфейсы При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные)Пример
Раньше класс бинарные операции мы делали вот так
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);
}