注目記事

【Javaコード入門】修飾子_⑥sealed/non-sealed修飾子

継承可能なクラスを制限する - sealed/non-sealed修飾子

従来のJavaでは、継承そのものを常に許可するか(デフォルト)、完全に禁止するか(final修飾子)しかできませんでした。しかし、Java 17で導入された#シールクラス#(*)を利用することで、特定のクラスに対してのみ継承を許可することが可能になります。シールクラスを定義するには、classブロックにsealed修飾子を付与するだけです。

*)シールクラスとは呼ばれますが、インターフェイスでも同様にsealed修飾子を利用できます。

ModSeal.java

  1. sealed class Animal permits ★Hamster, Cat★ {}
  2. sealed class Hamster permits ★DjungarianHamster★ extends Animal {}
  3. final class DjungarianHamster extends Hamster {}
  4. non-sealed class Cat extends Animal {}
  5. 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修飾子

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。