Вход/Регистрация
Java: руководство для начинающих
вернуться

Шилдт Герберт

Шрифт:

Для создания перечисления служит ключевое слово enum. Ниже приведен пример простого перечисления разных видов транспортных средств. // Перечисление видов транспортных средств, enum Transport { CAR, TRUCK, AIRPLANE, TRAIN, BOAT }

Идентификаторы CAR, TRUCK и так далее называются константами перечислимого типа. Каждый из них автоматически неявно объявляется как открытый (public), статический (static) член перечисления Transport. Тип этих констант соответствует типу перечисления (в данном случае — Transport). В терминологии Java подобные константы называются самотипизированными (приставка “само” означает, что в качестве типа константы принимается тип перечисления).

Определив перечисление, можно создать переменную данного типа. Но, несмотря на то, что перечисление определяется как тип класса, получить экземпляр объекта типа enum с помощью оператора new нельзя. Переменная перечислимого типа создается подобно переменной простого типа. Например, для объявления переменной tp упомянутого выше перечислимого типа Transport служит следующее выражение: Transport tp;

Переменная tp относится к типу Transport, и поэтому ей можно присваивать только те значения, которые определены в данном перечислении. Например, в следующей строке кода переменной tp присваивается значение AIRPLANE: tp = Transport.AIRPLANE;

Обратите внимание на то, что идентификатор AIRPLANE полностью определяется как относящийся к типу Transport.

Для проверки равенства констант перечислимого типа служит оператор сравнения =. Например, в приведенной ниже строке кода содержимое переменной tp сравнивается с константой TRAIN, if(tp == Transport.TRAIN) // ...

Перечислимые значения можно также использовать в операторе switch. Очевидно, что в ветвях case этого оператора могут присутствовать только константы того же самого перечислимого типа, что и в выражении switch. Например, следующий фрагмент кода составлен правильно: // Применение перечисления для управления оператором switch, switch(tp) { case CAR: // ... case TRUCK: // ...

Как видите, в ветвях case используются константы без полного определения имени типа. Например, вместо Transport. TRUCK указано просто TRUCK. Это допустимо потому, что перечислимый тип в выражении switch неявно определяет тип констант в ветвях case. Более того, если попытаться указать тип константы явно, при компиляции возникнет ошибка.

При отображении константы перечислимого типа, например, с помощью метода println , выводится ее имя. Так, в результате выполнения следующего оператора отобразится имя BOAT: System.out.println(Transport.BOAT);

Ниже приведен пример программы, демонстрирующий все особенности применения перечисления Transport. // Особенности применения перечисления Transport. // Объявление перечисления. enum Transport { CAR, TRUCK, AIRPLANE, TRAIN, BOAT } class EnumDemo { public static void main(String args[]) { // Объявление ссылки на перечисление Transport. Transport tp; // Присваивание переменной tp константы AIRPLANE. tp = Transport.AIRPLANE; // вывести перечислимое значение System.out.println("Value of tp: " + tp) ; System.out.println; tp = Transport.TRAIN; // Проверка равенства двух объектов типа Transport. if(tp == Transport.TRAIN) // сравнить два перечислимых значения System.out.println("tp contains TRAIN.\n"); // Использование перечисления для управления оператором switch. switch(tp) { case CAR: System.out.println("A car carries people."); break; case TRUCK: System.out.println("A truck carries freight."); break; case AIRPLANE: System.out.println("An airplane flies."); break; case TRAIN: System.out.println("A train runs on rails."); break; case BOAT: System.put.println("A boat sails on water."); break; } } }

Результат выполнения данной программы выглядит следующим образом: Value of tp: AIRPLANE tp contains TRAIN. A train runs on rails.

Прежде чем переходить к рассмотрению следующей темы, необходимо сделать одно замечание. Имена констант в перечислении Transport указываются прописными буквами (например, одна из них называется CAR, а не саг). Но это требование не является обязательным. Не существует никаких ограничений на использование регистра символов в именах констант перечислимого типа. Но поскольку константы перечислимого типа, как правило, предназначены для замены переменных, объявленных как final, имена которых по традиции обозначаются прописными буквами, то и имена констант перечислимого типа, как правило, обозначаются прописными буквами. И хотя на этот счет имеются разные точки зрения, в примерах программ, представленных в этой книге, для констант перечислимого типа будут выбираться имена, обозначаемые прописными буквами. Перечисления в Java относятся к типам классов

Приведенные выше примеры демонстрируют создание и использование перечислений, но они не дают полного представления обо всех их возможностях. В отличие от других языков программирования перечисления в Java реализованы как типы классов. И хотя создать экземпляр объекта типа enum с помощью оператора new нельзя, во всем остальном перечисления ничем не отличаются от классов. Такой способ реализации перечислений наделяет их богатыми возможностями, принципиально недостижимыми в других языках. Это, в частности, позволяет определять конструкторы перечислений, добавлять в них переменные экземпляра, методы и даже создавать перечисления, реализующие интерфейсы. Методы values и vaJueOf

У всех перечислений имеются два предопределенных метода: values и valueOf .

Ниже приведены общие формы их объявления. public static перечислимый_тип[] values public static перечислимый_тип valueOf(String str)

Метод values возвращает массив, содержащий константы перечислимого типа, а метод valueOf — константу того же типа, значение которой соответствует символьной строке str, передаваемой этому методу в качестве параметра. В обоих чаях перечислимый_тип обозначает тип используемого перечисления. Так, если воспользоваться рассмотренным выше перечислением Transport, то при вызове метода Transport .valueOf ("TRAIN") будет возвращено значение TRAIN типа Transport. Ниже приведен пример программы, демонстрирующий применение методов values и valueOf. // Применение встроенных в перечисление методов. // Перечисление разных видов транспорта, enum Transport { CAR, TRUCK, AIRPLANE, TRAIN, BOAT } class EnumDemo2 { public static void main(String args[]) { Transport tp; System.out.println("Here are all Transport constants"); // воспользоваться методом values // Получение массива констант типа Transport. Transport allTransports[] = Transport.values; for(Transport t : allTransports) System.out.println(t); System.out.println; // воспользоваться методом valueOf // Получение константы под названием AIRPLANE. tp = Transport.valueOf("AIRPLANE"); System.out.println("tp contains " + tp); } }

  • Читать дальше
  • 1
  • ...
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: