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.