Java sealed-классы не спасут от ошибок в публичном API

Java sealed classes and exhaustive pattern matching

Java 17 представила sealed-классы, которые позволяют явно перечислять допустимые подтипы и обеспечивают проверку исчерпывающности pattern matching. Однако, как показывает разбор, при использовании sealed-типов в публичном API добавление нового подтипа становится ломающим изменением: потребители, собранные отдельно, могут получить MatchException только во время выполнения. Автор приходит к выводу, что sealed-типы полезнее внутри компонента, где всё перекомпилируется вместе, и опасны на границах модулей.

Даже если вы надеялись, что использование sealed-классов статически гарантирует обновление всех потребителей при добавлении нового случая, это не так, если не перекомпилировать всё.
  1. shepherdjerred

    Мне нравится, как далеко продвинулась Java. Я всё ещё предпочитаю TypeScript, так как много работаю с фронтендом и предпочитаю использовать один и тот же язык по всему стеку.

    При этом в TypeScript можно делать исчерпывающий pattern matching! https://github.com/gvergnaud/ts-pattern

  2. another_twist

    Мне потребовалось время, чтобы привыкнуть к sealed, и я не совсем понимал, зачем это нужно. Но ИИ, похоже, обожает это в Java, так что я попробовал — и теперь понял. Это как очень хороший механизм контроля доступа, особенно если используешь DI и хочешь что-то задепрекейтить. Не говоря уже, конечно, о pattern matching — он очень кстати для событийных сообщений, где меняется форма payload.

  3. armchairhacker

    В Java также есть рекурсивные паттерны и (возможно, всё ещё в preview) литеральные паттерны: `switch (x) { case A(B(true, var c)) -> f(c); }`

  4. timshel2

    Scala сейчас бьёт воздух кулаками

  5. panny

    Не думаю, что при sealed-типах нужны эти default в switch. Я не проверял компилятором, но, по-моему, они излишни.

  6. Larrikin

    Java продолжает пытаться догнать Kotlin

    https://kotlinlang.org/docs/sealed-classes.html

    Меня не смущала Java, когда сравнения были с C++, Ruby и Python. Но после Scala (которая, похоже, провалилась из-за своей неразборчивости) и особенно Kotlin я не нахожу причин возвращаться.

Ещё за этот день

2026-10-18