Menu
Coddy logo textTech

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: MONDAY

Wyliczenia 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: 20

Każ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ść enum

Typy 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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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, MEDIUM i LARGE, z cenami odpowiednio 2.50, 3.50 i 4.50.

    Każdy rozmiar potrzebuje prywatnego pola price (double), konstruktora, który je ustawia, oraz metody getPrice(), 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) i size (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 CoffeeSize za pomocą metody values(). 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
        
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online