Java 17 は sealed classes を導入し、開発者がインターフェースまたはクラスの許可されたサブクラスを明示的にリストできるようにした。この機能により exhaustive pattern matching が可能となり、コンパイラは switch 式で全てのケースをカバーし、default 節を必要としない。たとえば、sealed interface `SealedType` にサブクラス `TypeA` と `TypeB` がある場合、switch 式はこれらの 2 つのケースのみを処理し、default 節を省略できる。
しかし、これは新たな破壊的な変更をもたらす:sealed class に新しいサブクラスを追加すると、再コンパイルしないと既存コードが壊れる。再コンパイルしていないコンシューマーが新しいケースがトリガーされたときに ランタイム例外(例:`MatchException`)を受け取る可能性がある。これは特に sealed types が公開 API で公開される場合に問題となり、別々のコンパイルで検出されない失敗が生じる恐れがある。
sealed types は、すべてのコードが一緒に再コンパイルされる単一コンポーネントの実装内で最も有用である。モジュール間の境界で使用される場合、ランタイムでのみ検出できる新たな破壊方法を導入する可能性がある。開発者は、sealed types を公開 API に適用するかどうかを慎重に検討すべきである。
出典: Hacker News · 要約:HeadlinesBriefing