Java Switch ステートメント: 定数式要件のトラブルシューティング
提示されたシナリオでは、switch ステートメントは整数定数を定義された静的定数と照合しようとします。抽象クラスで。ただし、コンパイルは「定数式が必要です」エラーで失敗します。
当然のことながら、switch ステートメントにはコンパイル時の定数式が必要です。それでも、Foo.BAR、Foo.BAZ、および Foo.BAM 定数は定数のように見えます。
これらの定数はコンパイル時の定数式として扱われないのはなぜですか?
Java 言語仕様 (JLS) §15.28 によれば、コンパイル時の定数式は特定のプリミティブ型のみで構成され、リテラル(オブジェクト参照を除く)。この場合、Foo.BAR はコンパイル時ではなく実行時に初期化される静的フィールドを参照するため、コンパイル時の定数式ではありません。
問題の解決:
この問題を解決するには、Foo.BA* 変数をコンパイル時の定数で初期化する必要があります式:
public abstract class Foo { ... public static final int BAR = 1; public static final int BAZ = 2; public static final int BAM = 3; ... }
これらの初期化子を使用すると、コンパイラはコンパイル時に Foo.BA* の値を決定し、switch ステートメントでの使用を有効にすることができます。
代替enums を使用したアプローチ:
コンパイル時の定数値を確保するためのもう 1 つのオプションは、次のオプションを使用することです。 enums:
public enum FooConstants { BAR, BAZ, BAM }
ただし、enum を使用すると、デフォルトのケースを要求したり、式に評価されるケース ラベルを禁止したりするなど、追加の制限が課せられます。
以上がJava Switch ステートメントが抽象クラスからの静的定数を受け入れないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。