Автор оригинала: Jimish Bhayani.
В мире Java мы часто сталкиваемся с ситуацией, когда мы хотим, чтобы наш метод имел определенные значения в качестве аргументов. Другими словами, мы хотим ограничить значения набором предопределенных значений. Ну, вот тут-то и появляются перечисления.
Перечисление – это не что иное, как особый тип класса. Скоро мы столкнемся с оправданием.
Итак, вот формальное определение: Java позволяет нам ограничить переменную, чтобы она содержала только определенное значение из списка предопределенных значений, то, что мы их называем, – это Перечисляемый список . Элементы, которые мы указываем в перечисленном списке, являются (удивительно) называется Перечисления
.
Давайте рассмотрим перечисление на очень простом примере. Предположим , что мы создаем приложение Светофор , в котором мы будем принимать цвет света в качестве входных данных. В принципе, мы хотим ограничить ввод только одним из трех цветов, а именно: красный , зеленый и желтый .
Однако, если мы решим сохранить тип аргумента как String
, пользователи смогут отправлять любое значение, и в вводимом значении не будет никаких желаемых ограничений. Предположим, что пользователь посылает сильный “Черный” в качестве цвета, тогда мы можем ожидать, что приложение выйдет из строя . Теперь мы можем сделать вывод, что строка в качестве типа входных данных будет плохим выбором здесь.
Итак, давайте посмотрим, как мы можем достичь этого с помощью перечисления.
public enum TrafficLightColor { RED, GREEN, YELLOW } public void changeLight (TrafficLightColor trafficLightColor) { this.currentLight = trafficLightColor; }
Обратите внимание, что мы ограничили аргумент типом перечисления Цветом светофора
. Поэтому мы можем сказать, что перечисление обеспечивает безопасность типа .
Поэтому единственно возможные вызовы вышеуказанного метода Индикатор изменений
являются:
changeLight(TrafficLightColor.RED); changeLight(TrafficLightColor.YELLOW); changeLight(TrafficLightColor.GREEN);
Таким образом, мы можем сделать наш код менее подверженным ошибкам и без ошибок .
Перечисления может быть объявлено следующими упомянутыми возможными способами:
1. В независимом файле java (TrafficLightColor.java)
public enum TrafficLightColor { RED, GREEN, YELLOW } // Can be accessed as TrafficLightColor.RED
2. Внутри класса (TestOuter.java)
public class TestOuter { enum TrafficLightColor { RED, GREEN, YELLOW } } // Can be accessed as TestOuter.TrafficLightColor.RED;
Обратите внимание, что перечисления не могут быть объявлены в методе.
Теперь давайте посмотрим, что на самом деле происходит за сценой, когда мы создаем Перечисление
.
Самое главное, что нужно помнить, это то, что Перечисления не являются строковыми или int ! Каждый из перечисленных типов цветов светофора на самом деле является экземпляром цвета светофора. Другими словами, КРАСНЫЙ цвет относится к типу Цвета светофора. Давайте обрамим тот же цвет Перечисления
светофора, что и класс. Это выглядело бы примерно так:
class TrafficLightColor { public static final TrafficLightColor RED = new TrafficLightColor("RED", 0); public static final TrafficLightColor GREEN = new TrafficLightColor("GREEN", 1); public static final TrafficLightColor YELLOW = new TrafficLightColor("YELLOW", 2); TrafficLightColor(String enumName, int index){ // some lines of code } }
Используйте приведенный выше фрагмент только для понимания цели — фактическая внутренняя реализация перечислений может отличаться от того, что мы упомянули.
Приведенный выше фрагмент, однако, помог нам сделать еще несколько выводов о перечислениях:
Каждое из перечисленных значений КРАСНЫЙ , ЗЕЛЕНЫЙ и ЖЕЛТЫЙ является экземпляром класса Цвет светофора . Они представлены как статические и конечные, что в мире Java рассматривается как константа.
Каждое значение перечисления знает свой индекс или позицию. Таким образом, порядок, в котором объявляются значения перечисления, имеет значение. Это та же причина, по которой при повторении перечислений с помощью метода
values()
он будет повторяться в том же порядке, что и указано в его объявлении.
Я надеюсь, что мы вели себя хорошо и ясно. Мы подробнее рассмотрим практическую реализацию перечислений в моей будущей статье.
Если у вас есть какие-либо вопросы или предложения, не стесняйтесь обращаться ко мне на Codementor !
Оригинал: “https://www.codementor.io/@jimishbhayani/enums-in-java-exploring-the-basics-6drbjyraf”