継承可能なクラスを制限する - sealed/non-sealed修飾子
従来のJavaでは、継承そのものを常に許可するか(デフォルト)、完全に禁止するか(final修飾子)しかできませんでした。しかし、Java 17で導入された#シールクラス#(*)を利用することで、特定のクラスに対してのみ継承を許可することが可能になります。シールクラスを定義するには、classブロックにsealed修飾子を付与するだけです。
*)シールクラスとは呼ばれますが、インターフェイスでも同様にsealed修飾子を利用できます。
ModSeal.java
- sealed class Animal permits ★Hamster, Cat★ {}
- sealed class Hamster permits ★DjungarianHamster★ extends Animal {}
- final class DjungarianHamster extends Hamster {}
- non-sealed class Cat extends Animal {}
- class SiameseCat extends Cat {}
sealed修飾子を付与した場合には、permitsで許可する派生クラスを列挙する必要があります(太字)。この例であれば、AnimalクラスがHamster、Catクラスによる継承を許可し、Hamsterクラスが更にDjungarianHamsterクラスによる継承を許可する、という意味になります。
シールクラスを継承した派生クラス(ここではHamster、DjungarianHamster、Cat)には、sealed、non-sealed、finalいずれかの修飾子を付与しなければなりません。
さらに継承を認める場合はsealed修飾子を、これ以上の継承を認めない場合はfinal修飾子です(それぞれHamster、DjungarianHamsterです)。
そして、non-sealed修飾子は制限(sealed)を取り除く、という意味です。この例であれば、Catクラスがnon-sealed修飾子を付与しているので、Catクラスは制限なく(たとえば)SiameseCatクラスから継承できることが確認できます。
- 修飾子_目次
- 修飾子
- アクセス修飾子
- abstract修飾子
- static修飾子
- final修飾子
- sealed/non-sealed修飾子
- transient修飾子
- volatile修飾子
- synchronized修飾子
- native修飾子
- strictfp修飾子
監修