JDK

Java 15の新機能(1)ー「シールクラス」

Java 15で導入された新機能のうち、最初に紹介するのはシールクラス(Sealed class)である。まだプレビューとなっていて、正式な仕様ではない。シールクラスは、自身を継承できるクラスを指定したクラスだけに制限することができる。

次のようにVehicleクラスを定義する。sealedがシールクラスを示している。そして、permitsに続くBusとTruckが継承を許されたクラスである。すなわち、VehicleのサブクラスはBusとTruckのみが存在できる。

public sealed class Vehicle permits Bus, Truck
{
    protected int max_speed;
    @Override
    public String toString()
    {
        return this.getClass().getName();
    }
}

それでは、シールクラスを継承したBusクラスとTruckクラスを作成してみる。とりあえず、中身は空にして以下のようにBusクラスを定義してコンパイルしてみよう。プレビュー機能であるので、コンパイルオプションをつけてコンパイラを実行する。

javac –enable-preview -source 15 -Xlint:preview *.java

class Bus extends Vehicle
{
}
class Truck extends Vehicle
{
}

Vehicle.java:10: エラー: sealed、non-sealedまたはfinal修飾子が必要です
class Bus extends Vehicle
^
Vehicle.java:13: エラー: sealed、non-sealedまたはfinal修飾子が必要です
class Truck extends Vehicle
^
エラー2個

 コンパイルすると、上のようなコンパイルエラーが起きた。そこで、BusクラスとTruckクラスとfinalにして、再度コンパイルする。以下のようにするとコンパイルが成功した。

public sealed class Vehicle permits Bus, Truck
{
    protected int max_speed;
    @Override
    public String toString()
    {
        return this.getClass().getName();
    }
}
final class Bus extends Vehicle
{
}
final class Truck extends Vehicle
{
}

Vehicleクラスを継承して、新たにDogというクラスを定義してみる。

final class Dog extends Vehicle
{
}

コンパイルしようとすると、次のようなコンパイルエラーが発生して、Vehicleを継承できないことがわかる。

Vehicle.java:16: エラー: クラスはシール・クラスVehicleを拡張できません
final class Dog extends Vehicle
      ^
エラー1個