middle
Что такое Sealed Classes и Sealed Interfaces?
Sealed Classes (запечатанные классы) — механизм ограничения набора классов, которые могут наследоваться от данного класса или реализовывать интерфейс. Это позволяет компилятору знать все возможные подтипы и проверять полноту switch-выражений.
Аналогия из жизни: sealed class — как закрытый клуб с фейс-контролем: только перечисленные в списке (permits) могут войти, и охранник (компилятор) гарантирует, что никто посторонний не проникнет.
Пример: sealed interface и exhaustive switch
// Запечатанный интерфейс — только перечисленные классы могут его реализовать
public sealed interface Shape
permits Circle, Rectangle, Triangle {
}
public record Circle(double radius) implements Shape {}
public record Rectangle(double width, double height) implements Shape {}
public final class Triangle implements Shape {
private final double a, b, c;
// ...
}
// Exhaustive switch (компилятор проверяет полноту)
public double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
case Triangle t -> calculateTriangleArea(t);
// default не нужен — компилятор знает все подтипы!
};
}
Модификаторы наследников
| Модификатор | Поведение |
|---|---|
final |
Нельзя наследоваться далее |
sealed |
Можно, но с ограничением (свой permits) |
non-sealed |
Снять ограничение, любой может наследоваться |
Пример
public sealed class Animal permits Dog, Cat, Fish {}
public final class Dog extends Animal {}
public sealed class Cat extends Animal permits Persian, Siamese {}
public non-sealed class Fish extends Animal {} // открыт для наследования
Частые ошибки
- Забыть
permits— если наследники в том же файле,permitsнеобязателен (Java выведет автоматически) non-sealedнарушает гарантии — если один из подтиповnon-sealed, exhaustive switch невозможен- Sealed + Records — records implicitly final, поэтому идеальные кандидаты для sealed
Как используется в 2026
- Sealed classes + Records + Pattern Matching = алгебраические типы данных (ADT) в Java
- Широко используется для моделирования доменных событий, состояний, результатов
- Пример:
sealed interface Result<T> permits Success<T>, Failure<T>— type-safe обработка результатов
На собеседовании: покажите связку Sealed + Records + Pattern Matching — это главная ценность sealed classes. Интервьюер ожидает, что вы знаете про exhaustive switch без default и три модификатора наследников (final, sealed, non-sealed).