無駄なnewをしない

こんなプログラムを見かけた


List list = new ArrayList();
list = getList();


getList()は別な場所で定義されているものとする
一方私の書くプログラムはこんな感じ


List list = getList();


上のプログラムを書いた人は
下のプログラムを見てなぜ初期化せずに動くのか?
という疑問をもったらしい


今日はなぜかについて語ることにしよう


まず上のプログラムについて考える
new ArrayList();
ArrayListインスタンスを生成し
その参照先をlist変数に格納する


次にgetList()について考える
このクラスはListを返すので
メソッド内部でListのインスタンスが生成される


次に考えるのgetListでreturnされるものである
メソッド内では生成したインスタンスの参照先を
格納した変数が用意され、それがreturnされる
したがって戻ってくる値は参照先がどこにあるかという情報で
実際のインスタンスは同一のものを参照することになる


さて、ここで戻り値を格納する変数である
呼び出し元のlist変数を利用している
ここに参照先が格納される
その結果、listの値が書き換えられすでにnewしたArrayListを参照する
変数がなくなる


ここまでおわかりいただけただろうが
ArrayListは無駄な変数となってしまったわけである

めでたしめでたし〜〜