wyliczenie w Javie
W Javie wyliczenia (wyliczenia) są specjalnym typem używanym do definiowania grupy nazwanych stałych.
- Wyliczenia pomagają w utrzymaniu czytelności i bezpieczeństwie typów w programach, przypisując znaczące nazwy wartościom całkowitym.
- Przydatne głównie, gdy mamy mały zestaw możliwych wartości elementu, np. wskazówki, dni tygodnia itp.
Tworzenie wyliczenia
Składnia:
Javawyliczenie Nazwa wyliczenia {
STAŁA1 STAŁA2 STAŁA3;
}
enum TrafficLight { RED GREEN YELLOW ; } public class Test { public static void main ( String [] args ){ TrafficLight x = TrafficLight . RED ; System . out . println ( x ); } }
Wyjście
RED
Deklaracja wyliczenia w Javie
Deklarację wyliczenia można wykonać poza klasą lub wewnątrz klasy, ale nie wewnątrz metody.
1. Deklaracja poza zajęciami
Jak widzieliśmy w powyższym przykładzie wyliczenia można zadeklarować poza klasą i uzyskać do nich bezpośredni dostęp
2. Deklaracja wewnątrz klasy
Wyliczenia można również deklarować wewnątrz klasy, ale nie wewnątrz metody.
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 ); } }
Wyjście
RED
Właściwości Enum w Javie
Istnieją pewne właściwości, po których następuje Enum, jak wspomniano poniżej:
- Typ klasy: Zaimplementowane wewnętrznie jako klasa.
- Stałe wyliczeniowe: Każda stała jest obiektem typu wyliczeniowego.
- Przełącznik wsparcie: Można go używać w instrukcjach switch.
- Niejawne modyfikatory: Stałe są publicznym, statycznym finałem.
- Dziedzictwo: Wyliczenia nie mogą rozszerzać klas, ale mogą implementować interfejsy.
Enum w instrukcji Switch
Wyliczenia mogą być używane w instrukcjach switch do obsługi różnych przypadków w oparciu o stałe wyliczeniowe.
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' ); } } }
Wyjście
Other color
Wyliczenie z metodami i konstruktorem
Wyliczenia mogą mieć konstruktory i metody wykonywane oddzielnie dla każdej stałej
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 (); } }
Wyjście
Constructor called for: RED Constructor called for: GREEN Constructor called for: BLUE Color is: RED
Wyliczenie z metodami abstrakcyjnymi
Wyliczenia mogą deklarować metody abstrakcyjne, które każda stała musi implementować.
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 ()); } }
Wyjście
1st day 5th day
Iterowanie wyliczeń za pomocą wartości()
Użyj EnumType.values() do przeglądania wszystkich stałych wyliczeniowych.
Java enum Color { RED GREEN BLUE ; } public class Test { public static void main ( String [] args ){ for ( Color c : Color . values ()){ System . out . println ( c ); } } }
Wyjście
RED GREEN BLUE
Enum i EnumSet (Iteracja określonego zakresu)
EnumSet.range() umożliwia iterację po określonym zakresie stałych wyliczeniowych.
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 ); } } }
Wyjście
TUESDAY WEDNESDAY THURSDAY FRIDAY
Tworzenie klasy z członkiem Enum
Możemy łączyć wyliczenia ze zwykłymi klasami, aby uporządkować logikę programu. Wyliczenie może być zmienną składową klasy, a metody mogą wykonywać akcje na podstawie wartości wyliczenia.
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 (); } }
Wyjście
Mondays are tough Wednesday are okay Fridays are exciting Saturdays are relaxing Sunday are for rest
Wyjaśnienie:
- Klasa EnumTest w powyższym kodzie jest tworzona z elementem typu Day. Posiada konstruktor, który przyjmuje wyliczenie Day jako argument i przypisuje je.
- Klasa posiada metodę tellItLikeItIs(), która wypisuje komunikat w oparciu o wartość dnia.
- Główna metoda obejmuje obiekty EnumTest używające różnych wartości wyliczeniowych Day i wywołujące metodę tellItLikeItIs() na każdym z nich.
NOTATKA: Używane jest słowo kluczowe new, ponieważ EnumTest jest zwykłą klasą, a nie wyliczeniem, dlatego tworzymy instancje i przekazujemy wartość wyliczenia do jej konstruktora.