Java sealed-классы не спасут от ошибок в публичном API
Java sealed classes and exhaustive pattern matching
Java 17 представила sealed-классы, которые позволяют явно перечислять допустимые подтипы и обеспечивают проверку исчерпывающности pattern matching. Однако, как показывает разбор, при использовании sealed-типов в публичном API добавление нового подтипа становится ломающим изменением: потребители, собранные отдельно, могут получить MatchException только во время выполнения. Автор приходит к выводу, что sealed-типы полезнее внутри компонента, где всё перекомпилируется вместе, и опасны на границах модулей.
Даже если вы надеялись, что использование sealed-классов статически гарантирует обновление всех потребителей при добавлении нового случая, это не так, если не перекомпилировать всё.
- shepherdjerred
Мне нравится, как далеко продвинулась Java. Я всё ещё предпочитаю TypeScript, так как много работаю с фронтендом и предпочитаю использовать один и тот же язык по всему стеку.
При этом в TypeScript можно делать исчерпывающий pattern matching! https://github.com/gvergnaud/ts-pattern
- another_twist
Мне потребовалось время, чтобы привыкнуть к sealed, и я не совсем понимал, зачем это нужно. Но ИИ, похоже, обожает это в Java, так что я попробовал — и теперь понял. Это как очень хороший механизм контроля доступа, особенно если используешь DI и хочешь что-то задепрекейтить. Не говоря уже, конечно, о pattern matching — он очень кстати для событийных сообщений, где меняется форма payload.
- armchairhacker
В Java также есть рекурсивные паттерны и (возможно, всё ещё в preview) литеральные паттерны: `switch (x) { case A(B(true, var c)) -> f(c); }`
- timshel2
Scala сейчас бьёт воздух кулаками
- panny
Не думаю, что при sealed-типах нужны эти default в switch. Я не проверял компилятором, но, по-моему, они излишни.
- Larrikin
Java продолжает пытаться догнать Kotlin
https://kotlinlang.org/docs/sealed-classes.html
Меня не смущала Java, когда сравнения были с C++, Ruby и Python. Но после Scala (которая, похоже, провалилась из-за своей неразборчивости) и особенно Kotlin я не нахожу причин возвращаться.