[解決済み】ループの内側と外側で変数を宣言する
質問
なぜ、以下のように正常に動作するのでしょうか?
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です。 (以下の私のコメントを回答に挿入する)
いずれにせよ、正しいやり方は、すべてのコードをきちんと書き、製品の性能要件を定め、その要件に対して最終製品を測定し、要件を満たさない場合は、最適化を行っていくことです。そして、通常、最終的に起こることは、コードベース全体をくまなく調べ、あちこちにクロックサイクルを絞り込むために微調整やハッキングをする代わりに、ほんの数カ所に素晴らしい正式なアルゴリズムの最適化を提供する方法を見つけ、プログラムをその性能要件に適合させるということです。
関連
-
[解決済み] Eclipse で一致する変数がハイライトされない
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] HTMLの "role "属性は何のためにあるのですか?
-
[解決済み] Do-whileループをエミュレートする方法は?
-
[解決済み] 文字列を繰り返す簡単な方法
-
[解決済み] Stringの中にあるcharの出現回数を数えるにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] Java- <T extends Comparable<T>>の意味?
-
[解決済み] java.sql.SQLRecoverableException: IO エラーです。NL Exceptionが発生しました
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] x--やx++はここで何をするのですか?