[解決済み】Javaのswitch文。定数式が必要だが、定数である
質問
私はいくつかの静的定数を持つこのクラスで作業しています。
public abstract class Foo {
...
public static final int BAR;
public static final int BAZ;
public static final int BAM;
...
}
それから、定数を元に関連する文字列を取得する方法が欲しいです。
public static String lookup(int constant) {
switch (constant) {
case Foo.BAR: return "bar";
case Foo.BAZ: return "baz";
case Foo.BAM: return "bam";
default: return "unknown";
}
}
ところが、コンパイルすると
constant expression required
というエラーが3つのケースラベルのそれぞれで発生します。
コンパイラがswitchをコンパイルするためにコンパイル時に式が分かっている必要があることは理解できますが、なぜ
Foo.BA_
は定数なのでしょうか?
どのように解決する?
<ブロッククオートコンパイラがswitchをコンパイルするために、コンパイル時に式が分かっている必要があることは分かりましたが、なぜFoo.BA_は一定ではないのでしょうか?
フィールドが初期化された後に実行されるあらゆるコードの観点からは定数ですが、それらは コンパイル時定数 であり、JLS が要求する意味でのコンパイル時定数ではありません。 §15.28節 定数式 の指定については 定数式 1 . これは §4.12.4節 最終変数 では、次のように"定数変数"を定義しています。
プリミティブ型またはString型で、コンパイル時の定数式(15.28節)で初期化されたfinalの変数を定数変数と呼びます。変数が定数変数であるかどうかは、クラスの初期化 (§12.4.1) 、バイナリ互換性 (§13.1, §13.4.9) 、定型代入 (§16) に関して意味を持つことがあります。
あなたの例では、Foo.BA* 変数は初期化子を持たないので、"定数変数" として適格ではありません。 修正方法は簡単で、Foo.BA* 変数の宣言を変更して、コンパイル時の定数式である初期化子を持たせることです。
他の例では (初期化子がすでにコンパイル時の定数式である場合)、変数の宣言を
final
と宣言することが必要かもしれません。
を使用するようにコードを変更することができます。
enum
ではなく
int
定数ではなく、
-
あなたは
は
を含める必要があります。
default
がある場合でもcase
の既知の値すべてに対してenum
を参照してください。 なぜ enum のスイッチに default が必要なのですか? -
は
case
ラベルは全て明示的でなければなりません。enum
に評価される式ではなく、値でなければなりません。enum
値に評価される式ではありません。
1 - 定数式の制限をまとめると、以下のようになります。 定数式 a) プリミティブ型と
String
のみを使用することができます。 b) リテラルのプライマリ(
null
) と定数変数のみを許可する。 c) サブ式として括弧で囲まれた定数式を許可する。 d) 代入演算子以外の演算子を許可する。
++
,
--
または
instanceof
e) プリミティブ型への型キャストを許可する、または
String
だけである。
メソッドやラムダ呼び出しの形式は含まれないことに注意してください。
new
,
.class
.
.length
または配列の添え字を使用します。 さらに、配列の値のあらゆる使用。
enum
値,プリミティブラッパ型の値,ボックス化及びアンボックス化の使用は,a)のため,すべて除外される。
関連
-
[解決済み】Java:サブクラス下のenumでswitchステートメントを使用する
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
linux run jarfile Invalid or corrupt jarfile error.
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
IDEA パッケージステートメントの欠落
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
をインスタンス化することができません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
linux run jarfile Invalid or corrupt jarfile error.
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
ローカルリソースのロードが許可されていない場合の解決策