スイッチケースでスコープがどのように機能するか理解していないと思います。
最初のコードはコンパイルされないが、2番目のコードはコンパイルされる理由を誰かに説明できますか?
コード1:
int key = 2;
switch (key) {
case 1:
String str = "1";
return str;
case 2:
String str = "2"; // duplicate declaration of "str" according to Eclipse.
return str;
}
コード2:
int key = 2;
if (key == 1) {
String str = "1";
return str;
} else if (key == 2) {
String str = "2";
return str;
}
変数「str」のスコープがケース1に含まれていないのはなぜですか?
ケース1の宣言をスキップすると、変数「str」は宣言されません...
他の人が言ったことを繰り返します。各case
句の変数のスコープは、switch
ステートメント全体に対応します。ただし、次のようにブレース付きのネストされたスコープをさらに作成できます。
int key = 2;
switch (key) {
case 1: {
String str = "1";
return str;
}
case 2: {
String str = "2";
return str;
}
}
各str
句のcase
という名前の変数が独自のスコープ内にあるため、結果のコードは正常にコンパイルされます。
変数のスコープは、switch
ステートメント全体です。すべてのケースとデフォルト(含まれている場合)です。
他のオプションは次のとおりです...
オプション1:
int key = 2;
switch (key) {
case 1:
return "1";
case 2:
return "2";
}
オプション2:
int key = 2;
String str = null;
switch (key) {
case 1:
str = "1";
return str;
case 2:
str = "2";
return str;
}
各case
は、if/elseブロックのように、独自のローカルスコープを持つブロックであると仮定しているようです。そうではありません。
そうしないと、break
内のcase
を忘れるという頻繁なtrapに陥ってしまうので、この概念的な間違いを修正することが重要です。
私はそれが有効な質問だと思います、そして、ケース文の範囲の仮定は避けられません。 Javaライターがこれを正しくないために調整します。
例えばif文はデフォルトで、caseの終わりがbreak文で明示的に閉じられている場合の問題よりもスコープの最初の行を取ります。したがって、ケース1の宣言は、ケース2で使用できず、並列スコープを持ちますが、ネストされていません。
1つのswitchステートメントで複数のケースを実行できます。そう..
変数のスコープは、スイッチの中括弧とifステートメントの間に存在します。コード1の例では、スイッチの中括弧は変数の両方の宣言を囲み、変数バインディングの名前がすでに作成されているため、コンパイラにエラーが発生します。
他の例では、両方の変数が独自の中括弧(スコープ)内で宣言されているため、問題ありません。
最初の場合、文字列宣言のスコープはswitchステートメント内にあるため、重複として表示されますが、2番目の場合、文字列はif/else条件内のスコープを制限する中括弧で囲まれているため、エラーではありません2番目のケース。