Предаване на int в Enum в Java

1. Общ преглед

В този урок ще разгледаме накратко различните начини за предаване на int към стойност на преброяване в Java. Въпреки че няма пряк начин на кастинг, има няколко начина да го сближите.

2. Използване на Enum # стойности

Първо, нека да разгледаме как можем да решим този проблем с помощта на Enum е стойности метод.

Нека започнем със създаването на enum PizzaStatus, който определя състоянието на поръчка за пица:

public enum PizzaStatus { ORDERED(5), READY(2), DELIVERED(0); private int timeToDelivery; PizzaStatus (int timeToDelivery) { this.timeToDelivery = timeToDelivery; } // Method that gets the timeToDelivery variable. }

Свързваме всяка константна стойност на изброяване с полето timeToDelivery . Когато дефинираме константите, ние предаваме полето timeToDelivery на конструктора.

Методът статични стойности връща масив, съдържащ всички стойности на преброяването в реда на тяхното деклариране. Следователно можем да използваме целочислената стойност timeToDelivery, за да получим съответната стойност на изброяване :

int timeToDeliveryForOrderedPizzaStatus = 5; PizzaStatus pizzaOrderedStatus = null; for (PizzaStatus pizzaStatus : PizzaStatus.values()) { if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) { pizzaOrderedStatus = pizzaStatus; } } assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

Тук използваме масив, върнат от PizzaStatus.values ​​(), за да намерим съответстваща стойност въз основа на свойството timeToDelivery .

Този подход обаче е доста многословен. Освен това е и неефективно, тъй като всеки път, когато искаме да извлечем съответния PizzaStatus , трябва да прегледаме PizzaStatus.values ​​() .

2.1. Използване на Java 8 Stream

Нека да видим как можем да намерим съответстващия PizzaStatus, използвайки подхода Java 8:

int timeToDeliveryForOrderedPizzaStatus = 5; Optional pizzaStatus = Arrays.stream(PizzaStatus.values()) .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) .findFirst(); assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

Този код изглежда по-кратък от този, който използва цикъла for . И все пак, ние итерираме през PizzaStatus.values ​​() всеки път, когато трябва да получим съответстващо изброяване.

Също така имайте предвид, че при този подход получаваме директно Незадължителния вместо екземпляра PizzaStatus .

3. Използване на Map

На следващо място, нека да използват в Java Карта данни структура заедно с ценности метод за извличане на стойността на ENUM, съответстваща на време, за да достави стойност на цяло число.

При този подход методът на стойностите се извиква само веднъж, докато се инициализира картата . Освен това, тъй като използваме карта, не е необходимо да преглеждаме стойностите всеки път, когато трябва да извлечем стойността на преброяването, съответстваща на времето за доставяне.

Ние използваме статична карта timeToDeliveryToEnumValuesMapping вътрешно, която обработва картографирането на времето, за да се достави до съответната му стойност на изброяване.

Освен това методът на стойностите от класа Enum предоставя всички стойности на изброяването. В статичния блок итерираме върху масива от стойности на изброяването и ги добавяме към картата заедно със съответното време, за да доставим целочислена стойност като ключ:

private static Map timeToDeliveryToEnumValuesMapping = new HashMap(); static { for (PizzaStatus pizzaStatus : PizzaStatus.values()) { timeToDeliveryToEnumValuesMapping.put( pizzaStatus.getTimeToDelivery(), pizzaStatus ); } }

И накрая, ние създаваме статичен метод, който приема за параметър цялото число timeToDelivery . Този метод връща съответната стойност на изброяване, използвайки статичната карта timeToDeliveryToEnumValuesMapping :

public static PizzaStatus castIntToEnum(int timeToDelivery) { return timeToDeliveryToEnumValuesMapping.get(timeToDelivery); }

Използвайки статична карта и статичен метод, ние извличаме стойността на преброяването, съответстваща на времето, за да доставим целочислена стойност.

4. Заключение

В заключение разгледахме няколко заобиколни решения за извличане на стойности на преброяване, съответстващи на целочислената стойност.

Както винаги, всички тези примерни кодове са достъпни в GitHub.