В предыдущем примере вы, наверное, заметили, что создавать интерфейс только для записи констант не совсем удобно. Начиная с версии Java SE 5 для этой цели в язык введены перечисления (enumerations). Создавая перечисление, мы сразу же указываем константы, входящие в него.
Вместо интерфейса SharedConstants, описанного в предыщем примере, можно воспользоваться перечислением, сделав такую запись:
public
enum SharedConstants {NO, YES, MAYBE, LATER, SOON, NEVER}Как видите, запись сильно упростилась. Мы записываем только константы, не указывая их характеристики. Каков же, в таком случае, их тип? У них тип перечисления SharedConstants.
Перечисления в языке Java образуют самостоятельные типы, что указывается словом enum в описании перечисления, но все они неявно наследуют абстрактный класс java.lang.Enum. Это наследование не надо указывать словом extends, как мы обычно делаем, определяя классы. Оно введено только для того, чтобы включить перечисления в иерархию классов Java API. Тем не менее мы можем воспользоваться методами класса Enum для получения некоторых характеристик перечисления, как показано на примере ниже:
Обратите внимание, во-первых, на то, как задается цикл для перебора всех значений перечисления SharedConstants. В заголовке цикла определяется переменная scont типа перечисления SharedConstants. Метод values(), имеющийся в каждом перечислении, дает ссылку на его значения. Эти значения получает последовательно, одно за другим, переменная scont.
Во-вторых, посмотрите, как можно узнать тип значений перечисления. Его возвращает метод getDeclaringClass() класса Enum. В нашем случае мы получим тип SharedConstants (с полным именем пакета).
В-третьих, у каждой константы, входящей в перечисление, есть свой порядковый номер 0, 1, 2 и т. д. Его можно узнать методом ordinal() класса Enum.
В данном примере наша предыдущая программа мутировала в новый вид использующим enum. Поскольку, как и в предыдущем примере, ответы генерируются случайным образом, то вторая часть вывода программы всегда будет разной.
Обратите внимание, что статический импорт класса SharedConstants понадобился только для метода ask(), так как в методе answer() данный тип указан явно. Попробуйте закомментировать строку импорта данного класса и посмотрите на результат. А так же попытайтесь понять почему так происходит. Хотя я, в принципе, уже объяснил это :)
На этом мы с перечислениями еще не заканчиваем. Просто по ходу и логике повествования о них было лучше рассказать сейчас. Чуть погодя мы продолжим наше знакомство с ними поглубже.
Комментариев нет:
Отправить комментарий