0Pricing
Java Academy · Lekcja

sealed z rekordami

Modelowanie zamkniętych hierarchii

sealed z rekordami to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Typy sealed i rekordy

Interfejsy sealed i rekordy doskonale do siebie pasują. Interfejs sealed definiuje zamknięty zbiór przypadków, a każdy rekord jest jednym konkretnym, niezmiennym przypadkiem. Razem pozwalają modelować algebraiczne typy danych.

Rekordy są niejawnie final

Rekord jest automatycznie final, więc spełnia zasadę, zgodnie z którą dozwolone podtypy muszą być final, sealed albo non-sealed. Nie trzeba dodawać żadnego dodatkowego modyfikatora.

Zamknięta hierarchia kształtów

Modeluj kształty jako rekordy implementujące interfejs sealed, z których każdy przechowuje własne dane.

public class Main {
    sealed interface Shape permits Circle, Rectangle {}
    record Circle(double radius) implements Shape {}
    record Rectangle(double width, double height) implements Shape {}

    public static void main(String[] args) {
        Shape s = new Rectangle(3, 4);
        System.out.println(s);
    }
}

Dodawanie zachowania

Interfejs sealed może deklarować metody, które implementuje każdy rekord, zapewniając polimorfizm w obrębie zamkniętego zbioru.

public class Main {
    sealed interface Shape permits Circle, Rectangle {
        double area();
    }
    record Circle(double radius) implements Shape {
        public double area() { return Math.PI * radius * radius; }
    }
    record Rectangle(double width, double height) implements Shape {
        public double area() { return width * height; }
    }

    public static void main(String[] args) {
        Shape s = new Circle(2);
        System.out.printf("Area: %.2f%n", s.area());
    }
}

Automatyczne equals i toString

Rekordy automatycznie generują equals, hashCode i toString. Dwa rekordy z takimi samymi komponentami są równe, co doskonale sprawdza się przy modelowaniu wartości.

public class Main {
    sealed interface Shape permits Circle {}
    record Circle(double radius) implements Shape {}

    public static void main(String[] args) {
        Circle a = new Circle(5);
        Circle b = new Circle(5);
        System.out.println(a.equals(b));
        System.out.println(a);
    }
}

Modelowanie wyników

Często stosuje się typ wyniku sealed z rekordem oznaczającym powodzenie i rekordem oznaczającym błąd, zastępując zwracanie wartości null lub wyjątki w przewidywalnych sytuacjach.

public class Main {
    sealed interface Result permits Ok, Err {}
    record Ok(int value) implements Result {}
    record Err(String message) implements Result {}

    static Result parse(String s) {
        try { return new Ok(Integer.parseInt(s)); }
        catch (NumberFormatException e) { return new Err("bad number: " + s); }
    }

    public static void main(String[] args) {
        System.out.println(parse("42"));
        System.out.println(parse("oops"));
    }
}

Kompaktowe konstruktory do walidacji

Rekordy mogą sprawdzać poprawność danych wejściowych w kompaktowym konstruktorze, dzięki czemu każdy przypadek jest poprawny już na etapie tworzenia.

public class Main {
    sealed interface Shape permits Circle {}
    record Circle(double radius) implements Shape {
        Circle {
            if (radius < 0) throw new IllegalArgumentException("radius must be >= 0");
        }
    }

    public static void main(String[] args) {
        try { new Circle(-1); }
        catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
    }
}

Rekurencyjne modele danych

Ponieważ rekord może odwoływać się do interfejsu sealed, można budować rekurencyjne struktury, takie jak drzewa wyrażeń lub listy połączone.

public class Main {
    sealed interface Expr permits Num, Add {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}

    public static void main(String[] args) {
        Expr e = new Add(new Num(1), new Add(new Num(2), new Num(3)));
        System.out.println(e);
    }
}

Zalety niezmienności

Rekordy są płytko niezmienne, więc hierarchia rekordów sealed jest łatwa do analizowania, bezpieczna do współdzielenia i dobrze nadaje się do programowania współbieżnego. Nie trzeba defensywnie kopiować samych rekordów.

Łączenie z switch

Rekordy sealed doskonale współpracują z switch obsługującym dopasowywanie wzorców: każdy przypadek może rozpakować rekord, a kompilator sprawdza, czy uwzględniono wszystkie przypadki. Temat ten omawiamy w kursie dotyczącym wzorców.

Obliczenia na modelu

Możesz napisać interpreter jako metodę przechodzącą po rekurencyjnym drzewie rekordów.

public class Main {
    sealed interface Expr permits Num, Add {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}

    static int eval(Expr e) {
        if (e instanceof Num n) return n.value();
        Add a = (Add) e;
        return eval(a.left()) + eval(a.right());
    }

    public static void main(String[] args) {
        Expr e = new Add(new Num(4), new Add(new Num(5), new Num(6)));
        System.out.println(eval(e));
    }
}

Szybki test

Sprawdź swoją wiedzę na temat rekordów sealed.

Podsumowanie

Zapoznałeś się z łączeniem typów sealed z rekordami.

  • Rekordy są niejawnie final, więc mogą być dozwolonymi podtypami.
  • Interfejs sealed może deklarować wspólne metody.
  • Rekordy automatycznie zapewniają równość, obliczanie skrótów i toString.
  • Razem pozwalają modelować zamknięte, niezmienne i potencjalnie rekurencyjne dane.

Często zadawane pytania

Czy lekcja „sealed z rekordami” jest bezpłatna?

Tak — pełny tekst „sealed z rekordami” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „sealed z rekordami”?

Modelowanie zamkniętych hierarchii Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „sealed z rekordami”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Deklarowanie typów sealed
  2. Klauzula permits
  3. sealed z rekordami
  4. Wyrażenie switch exhaustive dla sealed
← Powrót do Java Academy