Help us understand the problem. What is going on with this article?

【Java】ループ内で使う変数はループの中で宣言しよう【ブロック内の変数】

More than 1 year has passed since last update.

はじめに

forループに限らず、whileループとかif-else文とかtry-catchとか・・・。
いろいろ「ブロック」はあるけれど、その中でしか使わない変数は、ブロックの中で宣言しましょうね、というお話です。

よくない例

List<String> strList = new ArrayList<String>();
String str = new String();  // ←これ!!!

for (int i = 0 ; i <= 10 ; i++) {
  str = i + "番目";
  strList.add(str);
}

※このプログラムが正しく動くかどうかは置いといて、スコープだけに焦点を当てて話を進めます。

String strをforループの外で宣言しているので、forループの外側でも使用可能です。
なので、「スコープは可能な限り小さく!」というJavaのセオリーには反しています。

この書き方をした人に聞いてみた

2人ほどこの書き方をしていた人がいたので、「どうしてこういう書き方にしたの?」って聞いてみました。
そしたら

同じString strを使いまわすので、メモリ節約になるかなーと :sparkles:

無駄な変数はたくさん作らないという意味では、決して間違った考え方ではないんですけどね:sweat_smile:
だけど、スコープが不必要に広がってしまうのでNG:ng:です。

よい例

List<String> strList = new ArrayList<String>();

for (int i = 0 ; i <= 10 ; i++) {
  String str = new String();
  str = i + "番目";
  strList.add(str);
}

※上記の「よくない例」と比較するために書きましたが、おそらく実際の現場ではこんなまどろっこしい書き方はしないと思ってます。
※このソースがイケてるかどうかではなく、スコープだけに焦点を当ててます。

String strを使うのはforループの中だけです。
だったら、forループの中で宣言すれば、スコープは小さくなります。

Javaは「使い終わったらすぐにメモリを開放する」ためのガベージコレクトが機能するので、forループ1回ごとに新しいString strが作られては解放されていきます。
そのため、あんまりメモリを意識しなくてよいと思います。

まとめ

forループの中だけで使う変数は、forループの中で宣言する。
※一番馴染みのありそうなforループで説明しましたが、if-else文やwhileループなどでも同様です。

乱暴な言い方をすると、迷ったら一旦ループの中に変数を入れてみましょう。
エラーにならなければ、そのまま入れっぱなしでOKです。

おまけ

「よい例」で書いたプログラムは、私の場合は、ここまで整理するかなー。

List<String> strList = new ArrayList<String>();

for (int i = 0 ; i <= 10 ; i++) {
  strList.add(i + "番目");
}
mtanabe
画面系に抵抗感のないJavaエンジニア。最近はMySQLとも仲がいいです。 設計から実装、テスト、チームメンバーの成果物のレビューなどなど、幅広くやってます。
techfun
Tech FunはITの力で世界を豊かにする総合サービス企業です。 IT研修スクール「TechFun.jp(https://techfun.jp/)」、eラーニングプラットフォーム「StudySmile(https://studysmile.com/)」のほか、ミャンマーオフショア開発、スマートフォンアプリ開発、Webシステム開発、SIサービスを展開しています。
https://www.techfun.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away