Typ enum - Java
W tym podrozdziale omówimy związek między typem enum i klasą. Podobnie jak klasy, także typy enum są typami referencyjnymi.
Typ enum korzysta z deklaracji enum, czyli listy oddzielonych przecinkami stałych enum — deklaracja może opcjonalnie zawierać inne komponenty tradycyjnych klas, np. konstruktor, pola i metody (o czym się zaraz przekonasz). Każda deklaracja enum deklaruje klasę enum o następujących ograniczeniach:
1. Stałe enum niejawnie stosują modyfikator final.
2. Stałe enum niejawnie stosują modyfikator static.
3. Każda próba utworzenia obiektu typu enum za pomocą operatora new zakończy się błędem kompilacji.
Stałe enum mogą pojawić się wszędzie tam, gdzie zwykłe stałe, na przykład w etykietach case instrukcji switch i w instrukcjach for.
Deklarowanie zmiennych instancji, konstruktora i metod w typie enum
Rysunek 8.10 przedstawia użycie zmiennych instancji, konstruktora i metod w typie enum. Deklaracja enum składa się z dwóch części — stałych enum i innych składowych typu.
2 // Deklaracja typu enum z konstruktorem,
3 // jawnymi polami i metodami dostępowymi
4
5 public enum Book {
6 // Deklaracja stałych typu enum
7 JHTP("Java How to Program", "2018"),
8 CHTP("C How to Program", "2016"),
9 IW3HTP("Internet & World Wide Web How to Program", "2012"),
10 CPPHTP("C++ How to Program", "2017"),
11 VBHTP("Visual Basic How to Program", "2014"),
12 CSHARPHTP("Visual C# How to Program", "2017");
13
14 // Zmienne instancji
15 private final String title; // Tytuł książki
16 private final String copyrightYear; // Rok praw autorskich
17
18 // Konstruktor
19 Book(String title, String copyrightYear) {
20 this.title = title;
21 this.copyrightYear = copyrightYear;
22 }
23
24 // Metoda pobierająca pole tytułu
25 public String getTitle() {
26 return title;
27 }
28
29 // Metoda pobierająca pole roku praw autorskich
30 public String getCopyrightYear() {
31 return copyrightYear;
32 }
33 }
Rysunek 8.10. Deklaracja typu enum z konstruktorem, jawnymi polami i metodami dostępowymi
Część pierwsza (wiersze od 7. do 12.) deklarują sześć stałych. Po każdej z nich znajdują się argumenty przekazywane do konstruktora enum (wiersze od 19. do 22.). Podobnie jak w konstruktorach w klasach, konstruktor enum może określić
dowolną liczbę parametrów i być przeciążony. W przedstawionym przykładzie konstruktor wymaga dwóch parametrów typu String: jeden określa tytuł, a drugi rok praw autorskich. Aby poprawnie zainicjalizować stałą, podajemy jej nazwę, a następnie w nawiasach dwa argumenty.
Druga część (wiersze od 15. do 32.) deklaruje pozostałe składowe enum: zmienne instancji title i copyrightYear (wiersz 15. i 16.), konstruktor (wiersze od 19. do 22.) i dwie metody (wiersze od 25. do 27. i od 30. do 32.), które zwracają tytuł książki i rok praw autorskich. Każda stała w typie Book jest obiektem typu Book i ma własne zmienne instancji.
Użycie enum typu Book
Rysunek 8.11 przedstawia testowanie enum typu Book i ilustruje, w jaki sposób można iterować po dostępnych stałych. Dla każdego enum kompilator generuje metodę statyczną values (używana w wierszu 10.), która zwraca tablicę stałych enum w kolejności ich zadeklarowania. Wiersze od 10. do 13. wyświetlają stałe. Wiersz 12. wywołuje metody getTitle i getCopyrightYear, aby pobrać tytuł i rok praw autorskich powiązane ze stałą. Gdy enum jest zamieniany na tekst (np. book w wierszu 11.), jako reprezentacja tekstowa służy identyfikator stałej (np. JHTP dla pierwszej stałej enum).
2 // Testowanie enum o nazwie Book
3 import java.util.EnumSet;
4
5 public class EnumTest {
6 public static void main(String[] args) {
7 System.out.println("Wszystkie książki:");
8
9 // Wyświetl wszystkie książki z enum Book
10 for (Book book : Book.values()) {
11 System.out.printf("%-10s%-45s%s%n", book,
12 book.getTitle(), book.getCopyrightYear());
13 }
14
15 System.out.printf("%nWyświetlenie zakresu stałych w enum:%n");
16
17 // Wyświetl pierwsze cztery książki
18 for (Book book : EnumSet.range(Book.JHTP, Book.CPPHTP)) {
19 System.out.printf("%-10s%-45s%s%n", book,
20 book.getTitle(), book.getCopyrightYear());
21 }
22 }
23 }
JHTP Java How to Program 2018
CHTP C How to Program 2016
IW3HTP Internet & World Wide Web How to Program 2012
CPPHTP C++ How to Program 2017
VBHTP Visual Basic How to Program 2014
CSHARPHTP Visual C# How to Program 2017
Wyświetlenie zakresu stałych w enum:
JHTP Java How to Program 2018
CHTP C How to Program 2016
IW3HTP Internet & World Wide Web How to Program 2012
CPPHTP C++ How to Program 2017
Rysunek 8.11. Testowanie enum o nazwie Book
Wiersze od 18. do 21. używają statycznej metody range klasy EnumSet (pakiet java.util), aby wyświetlić zakres stałych enum typu Book. Metoda range przyjmuje dwa parametry — pierwszą i ostatnią stałą w zakresie — i zwraca EnumSet, który zawiera wszystkie stałe w podanym zakresie wraz z tymi zmiennymi. Przykładowo wyrażenie EnumSet.range(Book.JHTP, Book.CPPHTP) zwraca EnumSet zawierający Book.JHTP, Book.CHTP, Book.IW3HTP i Book.CPPHTP. Rozszerzona wersja pętli for może być stosowana z EnumSet w podobny sposób jak z tablicami, więc wiersze od 18. do 21. służą do wyświetlenia tytułu i roku praw autorskich dla
każdej książki znajdującej się w EnumSet. Klasa EnumSet zawiera kilka innych metod statycznych dotyczących tworzenia zbiorów stałych na podstawie wybranego enum.
Typowy błąd programistyczny
W deklaracji enum błędem składniowym jest próba zadeklarowania stałych po konstruktorze, polach lub metodzie typu enum.
Programowanie w Javie. Solidna wiedza w praktyce. Wydanie XI, Autorzy: Paul Deitel, Harvey Deitel, Wydawnictwo: Helion