Hardsealedjava17

Что такое sealed classes (Java 17)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Sealed class/interface — явно перечисляет разрешённых наследников через permits. Наследники должны быть final, sealed или non-sealed.

sealed interface Shape permits Circle, Square, Triangle {}
record Circle(double r) implements Shape {}
record Square(double side) implements Shape {}
record Triangle(double base, double h) implements Shape {}

// Exhaustive switch (Java 21) — default не нужен
double area = switch (shape) {
    case Circle c -> Math.PI * c.r() * c.r();
    case Square s -> s.side() * s.side();
    case Triangle t -> 0.5 * t.base() * t.h();
};
  • Закрытая иерархия → компилятор гарантирует exhaustive pattern matching;
  • Если добавить наследника и забыть case — ошибка компиляции;
  • non-sealed открывает ветку для любого наследования;
  • Records + sealed = algebraic data types, замена visitor pattern;
  • Безопасность — нельзя создать постороннюю реализацию (modulo reflection perms).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.