型階層のためのsealed クラス
型を拡張できるクラスを制限し、網羅的なswitchを可能にする。
コード比較
✕ Java 8
// Anyone can extend Shape
public abstract class Shape { }
public class Circle extends Shape { }
public class Rect extends Shape { }
// unknown subclasses possible
✓ Java 17+
public sealed interface Shape
permits Circle, Rect {}
public record Circle(double r)
implements Shape {}
public record Rect(double w, double h)
implements Shape {}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
制御された継承
許可されたサブタイプのみが拡張可能 — 想定外のサブクラスはありません。
網羅的なマッチング
コンパイラがすべてのケースをカバーしているか検証 — defaultが不要になります。
代数的データ型
sum型を自然に表現できます — sealed + records = JavaのADT。
旧来のアプローチ
オープンな継承階層
モダンなアプローチ
sealed permits
JDKバージョン
17
難易度
中級
JDKサポート
型階層のためのsealed クラス
利用可能
JDK 17 LTS(2021年9月)以降、広く利用可能
仕組み
sealedクラスはサブタイプの閉じた集合を定義します。コンパイラはすべてのケースを把握しているため、defaultブランチなしで網羅的なパターンマッチングが可能です。レコードと組み合わせることで代数的データ型をモデル化できます。
関連ドキュメント