質問

次のメソッドは、内側のブロックが外側のブロックの変数と同じ名前の変数を宣言しているため機能しません。どうやら変数は宣言されているブロックではなく、宣言されているメソッドまたはクラスに属しているため、外側のスコープの変数をプッシュするデバッグ用の短い一時ブロックを書くことはできませんちょっと影をつけます:

void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
}

これまでに使用したほとんどすべてのブロックスコープ言語は、学校で通訳やコンパイラを作成した些細な小さな言語を含め、これをサポートしていました。 Perlはこれを行うことができ、SchemeやCもできます。PL/ SQLでもサポートしています!

このJavaの設計決定の根拠は何ですか?

編集:誰かが指摘したように、Javaにはブロックスコープがあります。私が尋ねているコンセプトの名前は何ですか?これらの言語設計のクラスからもっと多くのことを思い出せたらいいのにと思います。 :)

役に立ちましたか?

解決

理論的根拠は、ほとんどの場合、意図的ではなく、プログラミングまたはロジックの欠陥であると考えています。

あなたと同じくらい簡単な例では、それは明らかですが、コードの大きなブロックでは、変数を誤って再宣言することは明らかではないかもしれません。

ETA:Javaの例外処理にも関連している可能性があります。この質問の一部は、tryセクションで宣言された変数がcatch / finallyスコープで使用できない理由に関する質問で議論されたと思いました。

他のヒント

まあ、厳密に言えば、Javaにはブロックスコープの変数宣言があります 。これはエラーです:

void methodName() {
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
  System.out.println(i); // error
}

「i」はforブロックの外側に存在しないため。

問題は、同じメソッドの外部ブロックで宣言された別の変数と同じ名前の変数をJavaで作成できないことです。他の人が言ったように、おそらくこれは識別が困難なバグを防ぐために行われました。

ライターがこれを意図的に行い、同じ名前の2つの変数があることを忘れて完全に台無しにすることは珍しくないためです。それらは内部変数名を変更しますが、変数を使用するコードを残します。これにより、以前はシャドウされた変数が意図せずに使用されます。これにより、プログラムは引き続きコンパイルされますが、バグが発生します。

同様に、誤って変数をシャドウイングしてプログラムの動作を変更することも珍しくありません。知らないうちに既存の変数をシャドウイングすると、前述のように変数をシャドウイング解除するのと同じくらい簡単にプログラムを変更できます。

このシャドーイングを許可するメリットはほとんどないので、危険すぎると判断しました。真剣に、あなたの新しい変数を別のものと呼ぶだけで、問題はなくなります。

見つけにくいバグにつながると思います。 C#でも同様です。

関数本体の上で変数を宣言する必要があるため、Pascalはこれをサポートしていません。

この質問の根底にある仮定は間違っています。

Javaにはブロックレベルのスコープがありますあります。ただし、スコープの階層もあるため、 for ループ内で i を参照できますが、forループ外では j を参照できません。 。

public void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    i = j * 2;
  }

  //this would cause a compilation error!
  j++;
}

スコーピングが他の方法で振る舞う理由を理解することはできません。 forループ内で参照している i を判別することは不可能であり、 i メソッド内。

別の理由:この種の変数宣言が許可された場合、外部ブロック変数にアクセスする方法が必要になります(必要ですか?)。 「外側」のようなものかもしれません。キーワードが追加されます:

void methodName() {
    int i = 7;
    for (int j = 0; j < 10; j++) {
        int i = outer.i * 2;
        if(i > 10) {
            int i = outer.outer.i * 2 + outer.i;
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top