ホームページ > Java > &#&チュートリアル > Java Switch ステートメントが抽象クラスからの静的定数を受け入れないのはなぜですか?

Java Switch ステートメントが抽象クラスからの静的定数を受け入れないのはなぜですか?

Patricia Arquette
リリース: 2024-12-19 21:29:13
オリジナル
970 人が閲覧しました

Why Doesn't My Java Switch Statement Accept Static Constants from an Abstract Class?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート