16 июл. 2015 г.

Перечисления. Часть 1 - знакомство.

В предыдущем примере вы, наверное, заметили, что создавать интерфейс только для записи констант не совсем удобно. Начиная с версии Java SE 5 для этой цели в язык введены перечисления (enumerations). Создавая перечисление, мы сразу же указываем константы, входящие в него.

Вместо интерфейса SharedConstants, описанного в предыщем примере, можно воспользоваться перечислением, сделав такую запись:

public enum SharedConstants {NO, YES, MAYBE, LATER, SOON, NEVER}

Как видите, запись сильно упростилась. Мы записываем только константы, не указывая их характеристики. Каков же, в таком случае, их тип? У них тип перечисления SharedConstants.

Перечисления в языке Java образуют самостоятельные типы, что указывается словом enum в описании перечисления, но все они неявно наследуют абстрактный класс java.lang.Enum. Это наследование не надо указывать словом extends, как мы обычно делаем, определяя классы. Оно введено только для того, чтобы включить перечисления в иерархию классов Java API. Тем не менее мы можем воспользоваться методами класса Enum для получения некоторых характеристик перечисления, как показано на примере ниже:

En001

Обратите внимание, во-первых, на то, как задается цикл для перебора всех значений перечисления SharedConstants. В заголовке цикла определяется переменная scont типа перечисления SharedConstants. Метод values(), имеющийся в каждом перечислении, дает ссылку на его значения. Эти значения получает последовательно, одно за другим, переменная scont.

Во-вторых, посмотрите, как можно узнать тип значений перечисления. Его возвращает метод getDeclaringClass() класса Enum. В нашем случае мы получим тип SharedConstants (с полным именем пакета).

En002

В-третьих, у каждой константы, входящей в перечисление, есть свой порядковый номер 0, 1, 2 и т. д. Его можно узнать методом ordinal() класса Enum.

 

En004

En003

В данном примере наша предыдущая программа мутировала в новый вид использующим enum. Поскольку, как и в предыдущем примере, ответы генерируются случайным образом, то вторая часть вывода программы всегда будет разной.

Обратите внимание, что статический импорт класса SharedConstants понадобился только для метода  ask(), так как в методе answer() данный тип указан явно. Попробуйте закомментировать строку импорта данного класса и посмотрите на результат. А так же попытайтесь понять почему так происходит. Хотя я, в принципе, уже объяснил это :)

На этом мы с перечислениями еще не заканчиваем. Просто по ходу и логике повествования о них было лучше рассказать сейчас. Чуть погодя мы продолжим наше знакомство с ними поглубже.

Комментариев нет:

Отправить комментарий