enum в Java
В Java изброяванията (enums) са специален тип, използван за дефиниране на група наименувани константи.
- Енумите помагат за поддръжката на четимост и безопасността на типа в програмите, като присвояват смислени имена на целочислени стойности.
- Основно полезно, когато имаме малък набор от възможни стойности за елемент като упътвания дни от седмицата и т.н.
Създаване на Enum
Синтаксис:
Javaenum EnumName {
CONSTANT1 CONSTANT2 CONSTANT3;
}
enum TrafficLight { RED GREEN YELLOW ; } public class Test { public static void main ( String [] args ){ TrafficLight x = TrafficLight . RED ; System . out . println ( x ); } }
Изход
RED
Декларация на enum в Java
Декларацията на Enum може да се направи извън клас или вътре в клас, но не и в метод.
1. Декларация извън класа
Както видяхме в горния пример, enum-ите могат да бъдат декларирани извън клас и достъпни директно
2. Декларация вътре в клас
Енумите също могат да бъдат декларирани в клас, но не и в метод.
Java public class Test { enum Color { RED GREEN BLUE ; } // Driver method public static void main ( String [] args ) { Color c1 = Color . RED ; System . out . println ( c1 ); } }
Изход
RED
Свойства на Enum в Java
Има определени свойства, последвани от Enum, както е споменато по-долу:
- Тип клас: Вътрешно имплементиран като клас.
- Enum константи: Всяка константа е обект от типа enum.
- Поддръжка на превключвател: Може да се използва в оператори за превключване.
- Неявни модификатори: Константите са публични статични окончателни.
- Наследство: Enum не могат да разширяват класове, но могат да имплементират интерфейси.
Enum в оператор Switch
Енумите могат да се използват в оператори за превключване за обработка на различни случаи въз основа на константите на енума.
Java import java.io.* ; class GFG { // Enum Declared enum Color { RED GREEN BLUE YELLOW ; } public static void main ( String [] args ){ Color var_1 = Color . YELLOW ; // Switch case with Enum switch ( var_1 ) { case RED : System . out . println ( 'Red color' ); break ; case GREEN : System . out . println ( 'Green color' ); break ; case BLUE : System . out . println ( 'Blue color' ); break ; default : System . out . println ( 'Other color' ); } } }
Изход
Other color
Enum с методи и конструктор
Енумите могат да имат конструктори и методи, изпълнявани отделно за всяка константа
Java enum Color { RED GREEN BLUE ; private Color (){ System . out . println ( 'Constructor called for: ' + this ); } public void display (){ System . out . println ( 'Color is: ' + this ); } } public class Test { public static void main ( String [] args ){ Color c1 = Color . RED ; c1 . display (); } }
Изход
Constructor called for: RED Constructor called for: GREEN Constructor called for: BLUE Color is: RED
Енум с абстрактни методи
Енумите могат да декларират абстрактни методи, които всяка константа трябва да имплементира.
Java enum Day { MONDAY { public String getNumber (){ return '1st day' ; } } FRIDAY { public String getNumber (){ return '5th day' ; } }; public abstract String getNumber (); } public class EnumTest { public static void main ( String [] args ){ System . out . println ( Day . MONDAY . getNumber ()); System . out . println ( Day . FRIDAY . getNumber ()); } }
Изход
1st day 5th day
Итериране на енуми с помощта на values()
Използвайте EnumType.values(), за да преминете през всички enum константи.
Java enum Color { RED GREEN BLUE ; } public class Test { public static void main ( String [] args ){ for ( Color c : Color . values ()){ System . out . println ( c ); } } }
Изход
RED GREEN BLUE
Enum и EnumSet (итерация на специфичен диапазон)
EnumSet.range() позволява итерация в определен диапазон от enum константи.
Java import java.util.EnumSet ; public class EnumSetExample { enum Day { SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY ; } public static void main ( String [] args ){ EnumSet < Day > workDays = EnumSet . range ( Day . TUESDAY Day . FRIDAY ); for ( Day d : workDays ){ System . out . println ( d ); } } }
Изход
TUESDAY WEDNESDAY THURSDAY FRIDAY
Създаване на клас с член Enum
Можем да комбинираме enums с редовни класове, за да организираме вашата програмна логика. Enum може да бъде променлива член в клас и методите могат да извършват действия въз основа на стойността на enum.
Java /*package whatever //do not write package name here */ import java.io.* ; enum Day { MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY } public class EnumTest { // Enum member variable Day day ; // constructor which takes enum value public EnumTest ( Day day ) { this . day = day ; } // method to execute action as per enum value public void tellItLikeItIs () { switch ( day ) { case MONDAY : System . out . println ( 'Mondays are tough' ); break ; case TUESDAY : System . out . println ( 'Tuesday are better' ); break ; case WEDNESDAY : System . out . println ( 'Wednesday are okay' ); break ; case THURSDAY : System . out . println ( 'Thursdays are hopeful' ); break ; case FRIDAY : System . out . println ( 'Fridays are exciting' ); break ; case SATURDAY : System . out . println ( 'Saturdays are relaxing' ); break ; case SUNDAY : System . out . println ( 'Sunday are for rest' ); break ; default : System . out . println ( 'Everyday are good' ); break ; } } public static void main ( String [] args ) { EnumTest firstDay = new EnumTest ( Day . MONDAY ); firstDay . tellItLikeItIs (); EnumTest thirdDay = new EnumTest ( Day . WEDNESDAY ); thirdDay . tellItLikeItIs (); EnumTest fifthDay = new EnumTest ( Day . FRIDAY ); fifthDay . tellItLikeItIs (); EnumTest sixthDay = new EnumTest ( Day . SATURDAY ); sixthDay . tellItLikeItIs (); EnumTest seventhDay = new EnumTest ( Day . SUNDAY ); seventhDay . tellItLikeItIs (); } }
Изход
Mondays are tough Wednesday are okay Fridays are exciting Saturdays are relaxing Sunday are for rest
Обяснение:
- Класът EnumTest в горния код е създаден с член от тип Day. Има конструктор, който приема Day enum като аргумент и го присвоява.
- Класът има метод tellItLikeItIs(), който отпечатва съобщение въз основа на стойността на деня.
- Основният метод включва обекти на EnumTest, използващи различни стойности на Day enum и извикване на метода tellItLikeItIs() за всеки.
ЗАБЕЛЕЖКА: Новата ключова дума се използва, защото EnumTest е обикновен клас, а не enum, така че създаваме екземпляри и предаваме стойността на enum на неговия конструктор.