Перечисления — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Введение)
Строка 21: Строка 21:
 
Перечисления могут реализовывать любые интерфейсы
 
Перечисления могут реализовывать любые интерфейсы
 
При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные)
 
При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные)
 +
==Конструкция <tex>enum</tex>==
 +
Начнем с примера. Давайте опишем с помощью enum тип данных для хранения времени года:
 +
 +
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
 +
 +
Ну и простой пример его использования:
 +
 +
Season season = Season.SPRING;
 +
if (season == Season.SPRING) season = Season.SUMMER;
 +
System.out.println(season);
 +
 +
В результате выполнения которого на консоль будет выведено SUMMER.
  
 
== Пример ==
 
== Пример ==

Версия 17:04, 19 июня 2013

Предистория

Программируя мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление [math](enum)[/math].

Введение

В [math]Java[/math], начиная с версии 1.5, помимо всего прочего появились так называемые перечисления [math](enum)[/math]. Существует целый ряд плюсов от использования перечислений против именованных констант: Компилятор гарантирует корректную проверку типов Удобство итерации по всем возможным значениям перечисления Они занимают меньше места в [math]switch-[/math]блоке (не нужно указывать имя класса) и т.д.

Однако по сравнению, допустим, с C++, перечисления в [math]Java[/math] представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость. Во-первых, все перечисления наследуются от класса [math]java.lang.Enum[/math], у которого есть ряд удобных методов, а именно:

[math]— name()[/math] — имя константы в виде строки

[math]— ordinal()[/math] — порядок константы (соответствует порядку, в котором объявлены константы)

[math]— valueOf()[/math] — статический метод, позволяющий получить объект перечисления по классу и имени

Далее, как уже было озвучено, у класса перечисления есть возможность получить все возможные значения перечисления путем вызова метода [math]java.lang.Class.getEnumConstants()[/math] у класса перечисления В классе перечисления имеется возможность задавать конструкторы (только приватные), поля и методы Перечисления могут реализовывать любые интерфейсы При этом методы в перечислении могут быть абстрактными, а конкретные экземпляры констант могут определять такие методы (как, впрочем, и переопределять уже определенные)

Конструкция [math]enum[/math]

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

enum Season { WINTER, SPRING, SUMMER, AUTUMN }

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

Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);

В результате выполнения которого на консоль будет выведено SUMMER.

Пример

Раньше класс бинарные операции мы делали вот так

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

}