2017-03-06 3 views
1

Wikipediaによると、空白の最終変数は、宣言に定義時に初期化子がない最終変数です。空白の最終変数を含むswitch文

同時に、switch case文の値はコンパイル時の定数値でなければなりません。

2つの確約上記1として、私は以下のコードスニペットの両方が問題なくコンパイルを期待する、しかし、最初のものだけではありません:

final int y = 1; 

    switch(1) { 
     case y: 
    } 

final int y; 
    y = 1; 
    switch(1) { 
     case y: 
    } 

は持っていないならJavaコンパイラは、空白の最終変数が割り当てられていることを確認し、エラーなしでコードをコンパイルするために、2番目の例でフロー分析を実行しますか?

+0

チェックこの回答https://stackoverflow.com/questions/3827393/java-switch-statement-constant-expression-required-but-it-is-constant#3827424実際 は、その質問の重複のように思えます –

答えて

0

スイッチケースには定数式が必要です。最初の例では、コンパイラは初期化を、すべてのy変数の代わりに使用される定数で置き換えます。コンパイラは、2番目のケースでこれを行うことはできません。

0

エラーメッセージconstant expression requiredが表示されます。 JLS 15.28より:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28定数式は、定数変数を参照する単純名です。再び、JLSからhttp://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4

ブランクファイナルは、宣言にイニシャライザがない最終変数です。

定数変数は、定数式(15.28)で初期化されるプリミティブ型または型Stringの最終変数です。変数が定数変数であるかどうかは、クラスの初期化(§12.4.1)、バイナリ互換性(§13.1、§13.4.9)、および確定割り当て(§16(限定割り当て))との関係に影響する可能性があります。

したがって、最初のケースでは、yは定数変数であり、後者の場合は空白変数です。だからあなたはそれを使うことができないのです。

関連する問題