1. ホーム

[解決済み】ループの内側と外側で変数を宣言する

2022-05-02 22:20:43

質問

なぜ、以下のように正常に動作するのでしょうか?

String str;
while (condition) {
    str = calculateStr();
    .....
}

でも、これは危険・不正解と言われています。

while (condition) {
    String str = calculateStr();
    .....
}

ループの外側で変数を宣言する必要はありますか?

どのように解決するのですか?

ローカル変数のスコープは常に最小でなければなりません。

あなたの例では str ではない の外で使用されます。 while ループの中で宣言しているので、そうでなければ質問されることはないでしょう。 while のループは、コンパイルできないので、選択肢にはないでしょう。

ということは str ない がループの外側で使用される場合、ループの外側で使用できる最小のスコープは str は、whileループの中にあります。

ということで、答えは がっちり その str は、絶対にwhileループの中で宣言する必要があります。ifもandもbutもありません。

このルールに違反する可能性がある唯一のケースは、何らかの理由でコードからクロックサイクルを絞り出すことが極めて重要である場合です。この場合、内部スコープの繰り返しごとにインスタンスを作成するのではなく、外部スコープでインスタンスを作成し、それを再利用することを検討するとよいかもしれません。しかし、javaでは文字列が不変なので、この例には当てはまりません。strの新しいインスタンスは常にループの最初に生成され、ループの終わりには捨てなければならないので、最適化の可能性はありません。

EDITです。 (以下の私のコメントを回答に挿入する)

いずれにせよ、正しいやり方は、すべてのコードをきちんと書き、製品の性能要件を定め、その要件に対して最終製品を測定し、要件を満たさない場合は、最適化を行っていくことです。そして、通常、最終的に起こることは、コードベース全体をくまなく調べ、あちこちにクロックサイクルを絞り込むために微調整やハッキングをする代わりに、ほんの数カ所に素晴らしい正式なアルゴリズムの最適化を提供する方法を見つけ、プログラムをその性能要件に適合させるということです。