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フィードバックを取得できます。ローカル設定は不要です。