Перечисления — различия между версиями
Sergej (обсуждение | вклад) |
Sergej (обсуждение | вклад) (→Введение) |
||
| Строка 8: | Строка 8: | ||
Однако по сравнению, допустим, с <tex>C++</tex>, перечисления в <tex>Java</tex> представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. | Однако по сравнению, допустим, с <tex>C++</tex>, перечисления в <tex>Java</tex> представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. | ||
Во-первых, все перечисления наследуются от класса <tex>java.lang.Enum</tex>, у которого есть ряд удобных методов, а именно: | Во-первых, все перечисления наследуются от класса <tex>java.lang.Enum</tex>, у которого есть ряд удобных методов, а именно: | ||
| + | |||
<tex>— name()</tex> — имя константы в виде строки | <tex>— name()</tex> — имя константы в виде строки | ||
| Строка 18: | Строка 19: | ||
Перечисления могут реализовывать любые интерфейсы | Перечисления могут реализовывать любые интерфейсы | ||
При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные) | При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные) | ||
| + | |||
== Пример == | == Пример == | ||
Раньше класс бинарные операции мы делали вот так | Раньше класс бинарные операции мы делали вот так | ||
Версия 16:46, 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);
}