Effective Java(項目4〜5)

結局昨日は2項目しか進まなかった。次のコードのメモリリークを発見できますか?とか言われて手間取った。結局わかんなかったし。んで以下相変わらずひどいですがメモ。

○項目4 重複したオブジェクトを生成するのを避ける

・String s = new String("silly"); //これをやってはいけない!!
→このStringコンストラクタへの引数である("silly")は、それ自身がStringインスタンスであると考えればわかりやすい。

・変更されることが無いオブジェクト(Calendarクラスで取得する特定の日付など)はstatic finalな定数にする
→static初期化子の利用を検討する。

・デザパタの1つであるアダプターは、内部で保持しているオブジェクトの状態以外の状態を持っていないため、ある特定のオブジェクトに対するアダプターのインスタンスを2つ以上作成する必要はない。

・但し、あくまでこの項で言いたいことは「オブジェクト生成はコストがかかるから避けるべき」ということではない。
→それを意識してコードがゴチャゴチャになるのはかえってマイナス、最新のJVMのGCはすごいよ
→余計なオブジェクトの生成を避けつつ、コードの明瞭性も向上する書き方がありますよという話

○項目5 廃れたオブジェクト参照を取り除く

・GCを持たない言語と比べて、GCを持つ言語はメモリ管理に気を配らなくて良い
→と思い勝ちだけどそれは間違い

・廃れた参照は(GCの対象にならず)メモリリークへと繋がる
→null参照設定はその対策のひとつとして有効
・但し、端から端までnull参照を設定するのはスマートではない(コードが煩雑になる)
→「メモリ管理を意識すべき所」を知っておくと良い

・メモリ管理を意識すべき所とは?(メモリリークが起きがちな所)
→スタックはその典型(他にはキャッシュとかも起きやすい)
・スタックは独自のメモリ管理をしている
→独自にメモリ管理を行う所は、プログラマもメモリ管理を意識すべき