1

好奇心から、これがメソッド内の有効なコードであるかどうかを確認するためにこれを試しました。

{
    // code
}

そして、そうです!スコープを制限するだけです。

{
    int i = 1;
}

i = 2; // error

これは、たとえば、構造的に次のようなことをする必要がある場合に便利です。

int i = 0;
for (; i < number; i++) {...}

doSomethingWithTheCount(i);

しかし、私はの範囲を制限したいと思いますi:

{
    int i = 0;
    for (; i < number; i++) {...}

    doSomethingWithTheCount(i);
}

そして確かに私はできます。これは他のことに役立ちますか、それとも単にあいまいですか?

さらに、オブジェクトのスコープを制限することは、ガベージコレクションをより早く確実に行うための良い方法であるため、これを行うことはその点で有益である可能性があることを読みました。あれは正しいですか?

4

3 に答える 3

1

本当に必要な場合は、このようにスコープを制限できますが、コンパイラは、変数がメソッドの終了前に再び使用されないことを自明に検出し、便利な場合はそのメモリまたはレジスタの場所を再利用します。

GC に関するあなたの編集に関して、(1) ints は GCd ではありません。(2) コンパイラがそのスコープ内での変数の使用の終了を検出すると、GC の目的でスコープをオーバーとしてマークし、(3 )単一の関数でこれが問題になるほど多くのメモリを消費している場合は、間違っています。

このようにスコープを明示的に制限するやむを得ない理由がなく、適切な制限が見当たらない場合を除き、使用しないことをお勧めします。他に何もないとしても、めったに使用されないため、他のプログラマーや後のメンテナーが (あなたのように) 以前に見たことがない場合や、なぜそれを行ったのか理解できなかった場合に、混乱する可能性があります。

于 2013-11-01T04:42:28.807 に答える
1

匿名ブロックを宣言することは本質的に間違っているわけではないので、それについて心配する必要はありません。一部の人々は、Java コーディング規約や多かれ少なかれ審美的な性質の他のアイデアに従って、それについて意見を持っているかもしれませんが、それは主観的なものであり、妥当性を判断するのはあなた次第です。私の場合、そのような問題はありません。

ただし、ガベージ コレクションに役立つというのは正しくありません。コンパイルされたバイトコードでは、ローカル変数はブロックのスコープの最後を超えて存続し、明示的にクリアしない限り値を保持しますnull。このブロックは、Java ソース内のシンボル割り当てにのみ影響し、JVM が認識するものには変換されません。

さらに、次のように、制御フローの目的でこれらの種類のブロックを使用することもできることに注意してください。

foo: {
    /* ... */
    if(bar)
        break foo;
    /* ... */
}

continue foo残念ながら、Java はカスタム ループ ロジックをサポートしていません。:(

于 2013-11-01T04:42:34.677 に答える
0

Java では (C とは異なり)、スコープが心配な場合は for ループ内で変数を宣言できます。

例えば:

for (int i = 0; i < number; i++) {
    //Do Something
}

while ループの場合、変数がメソッドのスコープ外にあることが心配な場合は、いつでも Do-While に変更できます。

例:

do {
    int i = 0;
    //Do Something

    i++;
} while (i < number);

コメント: あなたが今までやってきたことをできない/すべきでない理由がわかりません。個人的には、同じメソッドで while ループを実行しますが、for ループを変更して、私が持っているものを反映します。

于 2013-11-01T04:36:39.237 に答える