ブログ SUNM Tech & Business Blog

⌚ 2016/6/10 (Fri) 🔄 2024/3/20 (Wed)

Mr.Sunの技術Tips「【for文に潜む罠!繰り返してるのに繰り返してない?!(Java初心者向け)】後編」

Mr.Sunの技術Tips「【for文に潜む罠!繰り返してるのに繰り返してない?!(Java初心者向け)】後編」
Tips

(前編はこちらをご参照ください)

今起きていることは「違う値を設定したはずなのに、同じ値になっている」。

何故そのような事が起きたのか?この後編で、そこを解明していきたいと思います。

ポイントはズバリ【アドレス】!

変数を定義するということは、その型を入れる容れ物を用意して、名前をつけるということです。

今回用意した容れ物は、

  1. beanListという名前のList<TestBean>が入る容れ物
  2. beanという名前のTestBeanが入る容れ物
  3. strArrayという名前のString配列が入る容れ物

と、なります。

更に「変数に値を設定する」ということは、「名前をつけた容れ物に中身を入れる」・・・ということですよね。

ここに罠が潜んでいるとしたら・・・!?

「容れ物」には「容れ物」を置く場所が決まっている

名前をつけた容れ物には「アドレス」を割り当てなければなりません。そう、容れ物は「容れ物を置く場所(=アドレス)」が決まっているものなのです。つまり、

①beanListという名前のList<TestBean>が入る容れ物には、「beanという名前の容れ物が置いてある場所(アドレス)」が設定される。

mrsun2016060101.jpg

ソース解析:

List<TestBean> beanList = new ArrayList<TestBean>();

beanという名前のTestBeanが入る容れ物のitemAには、「strArrayという名前の容れ物が置いてある場所(アドレス)のうち、【for文で繰り返されているそれぞれの中身】」が設定される。

mrsun2016060102.jpg

ソース解析:

TestBean bean = new TestBean();

③strArrayという名前のString配列が入る容れ物には、「それぞれの配列要素にそれぞれの文字列の場所(アドレス)」が設定される。(解説画像では省略して、配列要素に直接文字列が入っているように表現しています)

mrsun2016060103.jpg

つまり、

for (strArrayの配列要素の数だけ繰り返し) {

beanのitemAに、strArrayの現在の繰り返し要素を設定

beanListに、beanのアドレスを設定

}

という処理をしていた、ということになります。

for文が終わってbeanListの中身を出力すると、同じbeanという名前の容れ物を使いまわしているだけなので、一番最後に追加した〝さしすだけが、Listに追加した数だけ表示されていた・・・ということです。

修正方法はこれ!

【現状】

for (strArrayの配列要素の数だけ繰り返し) {

beanのitemAに、strArrayの現在の繰り返し要素を設定

beanListに、beanのアドレスを設定

}

【修正】

for (strArrayの配列要素の数だけ繰り返し) {

beanという名前の容れ物を新しく用意する(=新しいアドレスに容れ物が置かれる)

beanのitemAに、strArrayの現在の繰り返し要素を設定

beanListに、beanのアドレスを設定

}

と、すればよいのです。

いかがでしょう?

「for文の中で新規インスタンスの生成が必要な理由」が、よくお分かり頂けたのではないかと思います。

また今後も技術Tipsをお送りしたいと思いますので、宜しくお願いします。

Mr.SUN

問い合わせ

お申し込みはこちら.png

サン・エム・システム サービス

詳しくはこちら(OneStopCloud).png 詳しくはこちら(PowerApps).png 詳しくはこちら(power-automate-desktop).png 詳しくはこちら(Inc-Resu).png