Enumy i metody enumów
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 50 z 87.
enum (wyliczenie) to specjalny typ klasy reprezentujący stały zestaw stałych. Zamiast używać dowolnych liczb całkowitych lub ciągów znaków do reprezentowania opcji, takich jak dni tygodnia lub statusy zamówień, wyliczenia zapewniają bezpieczne typowo, czytelne wartości.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // Wypisuje: MONDAYWyliczenia to coś więcej niż proste stałe: są pełnoprawnymi klasami. Możesz dodawać do nich pola, konstruktory i metody:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // Wypisuje: 20Każdy typ wyliczeniowy ma przydatne wbudowane metody. Metoda values() zwraca tablicę wszystkich stałych, a metoda valueOf() zamienia ciąg znaków na odpowiadającą mu stałą typu wyliczeniowego. Metoda ordinal() zwraca pozycję stałej (licząc od 0):
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // Konwertuje ciąg znaków na wartość enumTypy wyliczeniowe są idealne, gdy masz znany, stały zestaw wartości, który nie zmienia się w czasie działania programu, dzięki czemu Twój kod jest bezpieczniejszy i bardziej czytelny niż przy użyciu zwykłych stałych.
Wyzwanie
ŁatwyZbudujmy system składania zamówień w kawiarni, który pokazuje możliwości typów wyliczeniowych z polami, konstruktorami i metodami. Utworzysz typ wyliczeniowy CoffeeSize, który przechowuje informacje o cenach, oraz system obsługujący zamówienia klientów.
Rozmieścisz swój kod w trzech plikach:
CoffeeSize.java: Utwórz typ wyliczeniowy reprezentujący rozmiary kawy wraz z przypisanymi im cenami. Twój typ wyliczeniowy powinien mieć trzy stałe:SMALL,MEDIUMiLARGE, z cenami odpowiednio2.50,3.50i4.50.Każdy rozmiar potrzebuje prywatnego pola
price(double), konstruktora, który je ustawia, oraz metodygetPrice(), która je zwraca. Dodaj też metodęgetDescription(), która zwraca ciąg znaków w formacie:[size name] - $[price](na przykład:SMALL - $2.5)Order.java: Utwórz klasę reprezentującą zamówienie na kawę. Zamówienie ma dwa prywatne pola:customerName(String) isize(CoffeeSize). Dodaj konstruktor inicjalizujący oba pola oraz metody pobierające wartość każdego z nich.Dodaj metodę
getReceipt(), która zwraca wielowierszowy ciąg znaków:Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java: Ożyw swoją kawiarnię! Otrzymasz dwa dane wejściowe: imię klienta (String) i nazwę rozmiaru (String, na przykład "SMALL", "MEDIUM" lub "LARGE").Najpierw użyj
CoffeeSize.valueOf(), aby przekonwertować ciąg znaków z nazwą rozmiaru na odpowiadającą mu stałą typu wyliczeniowego. Utwórz zamówienie z imieniem klienta i rozmiarem, a następnie wyświetl paragon.Po wyświetleniu paragonu wypisz pusty wiersz, a następnie wyświetl całe menu, przechodząc przez wszystkie wartości
CoffeeSizeza pomocą metodyvalues(). Dla każdego rozmiaru wypisz jego opis w osobnym wierszu.
Otrzymasz kolejno dwa dane wejściowe: imię klienta i nazwę rozmiaru (jedną z wartości "SMALL", "MEDIUM" lub "LARGE").
Zwróć uwagę, że typ wyliczeniowy hermetyzuje zarówno oznaczenie rozmiaru, jak i przypisaną mu cenę — to znacznie czytelniejsze rozwiązanie niż używanie osobnych stałych lub magicznych liczb w całym kodzie!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane wejściowe
String customerName = scanner.nextLine();
String sizeName = scanner.nextLine();
// TODO: Przekształć sizeName na wartość typu wyliczeniowego CoffeeSize za pomocą valueOf()
// TODO: Utwórz Order z nazwą klienta i rozmiarem
// TODO: Wydrukuj paragon
// TODO: Wydrukuj pusty wiersz
// TODO: Wyświetl pełne menu, iterując po wszystkich wartościach CoffeeSize
// Wskazówka: Użyj CoffeeSize.values(), aby pobrać wszystkie stałe typu wyliczeniowego
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online