2016-10-31 15 views
3

Eclipseに次のコードを入力すると、「case式は定数式でなければなりません」と文句を言います。アレイにfinalと表示されている場合、その内容は一定でなければなりません。これはなぜ無効ですか?switch文で最終変数を使用できないのはなぜですか?

final String[] match={"a","b","c"}; 
switch (switchVar) { 
case match[0]: /* Eclipse complains here about nonconstant switch */ 
    System.out.println("Matches"); 
    break; 
default: 
    System.out.println("No Match"); 
    break; 
} 

答えて

6

配列については何も定数はありません。その内容はいつでも突然変異する可能性があります。 参照は同じであると言いますが、match[0]はいつでも異なる可能性があります。

には、一定の値を使用するがあります。変化しないことが保証されているもの列挙型、プリミティブリテラル(およびそのボックス対応)、およびStringリテラルのようなものは、このプロセスを通じて変更されないことが保証され、使用に有効です。

ですが、finalと表示されている変数を使用できますが、変更はできません。配列タイプが変更可能であるため、final変数に再割り当てしても正しく動作しません。あなたはリテラルを宣言しなければなりません。配列は、その内容が一定でなければならない、最終的にマークされている場合

String switchVar = "a"; 
final String matchZero = "a"; 
switch (switchVar) { 
    case matchZero: // valid since there's no way matchZero can ever be mutated 
     System.out.println("Matches"); 
     break; 
    default: 
     System.out.println("No Match"); 
     break; 
} 
+0

あなたの見積もりは「このポイントを補強しません」。文法は次のようになります: 'SwitchLabel: case ConstantExpression: case EnumConstantName: デフォルト:'。あなたの引用は、スイッチ表現自体の中にあるものについて、 'switch'部分にあります。 – EJP

+0

@EJP:それは少し混乱して読むことができます。同意する。私はそれに言い返した。 – Makoto

+0

「紛らわしい」?それは無関係だった。 – EJP

1

:ここ

は、既存のコードを見直し、以下の簡単なスニペットです。

これは誤った理解です。最終的な変数は、作成されている配列の新しいインスタンスのみを防ぎますが、変更されている配列の内容を妨げません。私はあなたの既存のコードでこれを行うことができますし、それが有効になります。

final String[] match = {"a", "b", "c"};   
    match[0] = "b"; // CHANGE HERE 
    switch (switchVar) { 
     case "a": //Fixing this to make it compile 
      /* Eclipse complains here about nonconstant switch */ 
      System.out.println("Matches"); 
      break; 
     default: 
      System.out.println("No Match"); 
      break; 
    } 

コードのコンパイルを行うためにと、switchステートメントを使用するには、定数を使用する必要があります。したがって、定数を宣言するか、または定位置の文字列を宣言すると、動作するようになります。 The Java Language Specification on switch statementsはすべてのステートメントを切り替える仮定が定数式で動作しますので、

final String[] match = {"a", "b", "c"};   
    switch (switchVar) { 
     case "a": // CHANGE HERE 
      /* Eclipse complains here about nonconstant switch */ 
      System.out.println("Matches"); 
      break; 
     default: 
      System.out.println("No Match"); 
      break; 
    } 

これがある理由は単純です。

0

あなたの質問のポイントは

final String[] match = {"a", "b", "c"}; 

が、これは、配列の一致のアドレスを変更することはできないことを意味し、「最終」ですが、それはない配列macthの値を変更することはできませんを意味します。

ケースステートメントには一定の値が必要です

関連する問題