0Pricing
Java Academy · レッスン

permits 節

許可するサブタイプを列挙します。

「permits 節」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

permits句

permits句は、sealed型が許可するサブタイプを指定するためのものです。型名の直後にpermitsキーワードを置いて記述します。

基本構文

permitsの後に、許可するサブタイプをカンマで区切って列挙します。

public class Main {
    sealed interface Vehicle permits Car, Truck, Motorcycle {}
    record Car() implements Vehicle {}
    record Truck() implements Vehicle {}
    record Motorcycle() implements Vehicle {}

    public static void main(String[] args) {
        Vehicle v = new Truck();
        System.out.println(v.getClass().getSimpleName());
    }
}

契約の実装

名前を指定した各サブタイプは、実際に(インターフェースの場合は)sealed型をimplementsし、(クラスの場合は)extendsする必要があります。そうでないクラスをpermitsに指定すると、コンパイルエラーになります。

permitsの省略

許可するすべてのサブタイプがsealed型と同じファイルで宣言されている場合は、permits全体を省略できます。コンパイラーがリストを自動的に推論します。

public class Main {
    sealed interface Status {}
    record Active() implements Status {}
    record Inactive() implements Status {}

    public static void main(String[] args) {
        Status s = new Active();
        System.out.println(s.getClass().getSimpleName());
    }
}

permitsが必要な場合

サブタイプが同じパッケージまたはモジュール内の別々のファイルにある場合は、permitsで明示的に列挙する必要があります。コンパイラーはファイルをまたいで推論できません。

順序は関係ない

permits内の名前の順序には、意味上の違いはありません。switchの動作などに影響することはなく、許可する型のリストとして機能するだけです。

permitsを使ったクラス階層

この句は、抽象的な振る舞いを持つsealedクラスでも同じように使えます。

public class Main {
    sealed static abstract class Node permits Leaf, Branch {
        abstract int size();
    }
    static final class Leaf extends Node {
        int size() { return 1; }
    }
    static final class Branch extends Node {
        final Node a, b;
        Branch(Node a, Node b) { this.a = a; this.b = b; }
        int size() { return a.size() + b.size(); }
    }

    public static void main(String[] args) {
        Node tree = new Branch(new Leaf(), new Branch(new Leaf(), new Leaf()));
        System.out.println("Leaves: " + tree.size());
    }
}

サブタイプの記載漏れ

クラスがsealedインターフェースを実装しているのにpermitsに記載されていない場合、コンパイルに失敗し、そのクラスはsealed型を継承することを許可されていないというメッセージが表示されます。

許可された型は公開情報

permitsのリストは型の契約の一部であり、classファイルに記録されます。ツールやコンパイラーはそれを読み取り、サブタイプの完全な集合を把握できます。

finalとsealedの子を混在させる

permitsのリストでは修飾子を混在させられます。一部の子はfinalにし、他の子はsealedにして継承階層をさらに深くできます。

public class Main {
    sealed interface Shape permits Circle, Polygon {}
    record Circle(double r) implements Shape {}
    sealed interface Polygon extends Shape permits Triangle, Rectangle {}
    record Triangle() implements Polygon {}
    record Rectangle() implements Polygon {}

    public static void main(String[] args) {
        Shape s = new Triangle();
        System.out.println(s instanceof Polygon);
    }
}

ベストプラクティス

読みやすさのため、sealed型とそのサブタイプは近くにまとめてください。小規模な単一ファイルの継承階層ではpermitsの省略を優先し、ファイルを分割する場合は明示的に列挙します。

理解度チェック

permits句についての理解度を確認しましょう。

まとめ

permits句について学びました。

  • sealed型の名前の後に、許可されるサブタイプを列挙します。
  • 列挙した各型は、sealed型を継承または実装する必要があります。
  • すべてのサブタイプが同じファイルにある場合は省略できます。
  • サブタイプ自体をsealedにして、継承階層を拡張することもできます。

よくある質問

「permits 節」レッスンは無料ですか?

はい。「permits 節」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「permits 節」で何を学びますか?

許可するサブタイプを列挙します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「permits 節」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Sealed 型の宣言
  2. permits 節
  3. Record と Sealed 型
  4. Sealed 型に対する網羅的な switch
← Java Academyに戻る