JavaSE17のSliverの学習で覚えにくいところを自分用にSAを作成
sealedクラス
final修飾子で継承できないクラスを定義することで不用意にサブクラスが継承されることは防ぐことができる。
finalの懸念点
(上に空行が必要)
SuperClassを継承しサブクラスAとBを作成する際にfinalで修飾することでサブクラスAとBを継承したサブクラスを作ることを防ぐとことはできる。
しかし新たにSuperClassを継承したCクラスを作成することができてしまい、Cクラスにfinalをつけ忘れるとCクラスを継承したD、E、、、クラスを無限に増殖することができてしまう。
この状況を防ぐためにJava17からsealed classが登場した。
宣言は以下の通り
(上に空行が必要)
public sealed class SuperClass permits A, B {
// something code
}
上記のクラスAとBはfinal
、sealed
、non-sealed
のいずれかで修飾しなければコンパイルエラーになる。
上記それぞれの修飾子について説明しなさい。
final
(上に空行が必要)
それ以上継承できないクラスを作成する。
sealed
(上に空行が必要)
さらに継承できるクラスをpermits以下で指定する必要がある。
non-sealed
(上に空行が必要)
継承できるクラスに制限を設けない。。
sealed interface
sealed interfaceについて簡単に説明しなさい。
(上に空行が必要)
sealed interfaceはsealed classと同様に使う。
使い方は同じで継承するinterfaceや実現するclassを制限することができる。
permitsで指定されたクラスやインターフェイスはsealed classと同様に`final`、`sealed`、`non-sealed`のいずれかで修飾される必要がある。
extends、implements、permitsはこの順番で記述しなければならい。