Gymterview
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).