Effective Java 2章
オブジェクトの生成と消滅を管理する
項目1 コンストラクタの代わりにstaticファクトリーメソッド
ファクトリメソッドの利点
- 生成するオブジェクトを表す名前を持つことができる
- コードの可読性が上がる
- シグニチャの制約がなくなる
- 新たなオブジェクトを生成するのでは無く既存のオブジェクトを返すことができる
- 不必要に重複したオブジェクトを生成しない
- 常に同じオブジェクトを返すことで同値比較(==演算子)でオブジェクトを比べることができる
- どんな型のオブジェクトでも返すことができる
ファクトリメソッドの欠点
- 作ることができないオブジェクトが出てくる
- 例えば、publicもしくはprotectedのコンストラクタを持たないクラスのサブクラスなど
- コンストラクタに比べ、JavaDocの中で目立たない
- 命名規則を用いてカバー
- valueOf,getInstanceなど
まとめ
無条件にコンストラクタを使うのではなく、ファクトリーメソッドも検討してみよう項目2 シングルトン特性を強調
シングルトンとは?
- 常に1つのインスタンスしか存在しないクラスのこと
実装方法
- static finalなフィールドIを用意する
- フィールドIに自分自身のインスタンスを持たせる
- クラスがメモリ上に確保された時点でインスタンスが1つになる
シリアライズ可能にする方法
- 第10章に譲ります
項目3 インスタンス化不可能
- ユーティリティクラスなどを設計する場合、インスタンスは不要
- コンストラクタが無い場合、コンパイラにより引数なしのコンストラクタが作られてしまう
- このような場合はprivateのコンストラクタを明示的に作り、インスタンス化不可能にする
項目4 重複したオブジェクトを新たにnewしない
String s = new("I'm Only String Object");よりも
String s = "I'm Reuse String Object";とすることでオブジェクトを使いまわすことができる。
- 使用頻度の高いメソッド内で生成されるオブジェクトは重複したオブジェクトになりやすい
- private static finalなオブジェクトとしてあらかじめ生成しておく
- 本書のisBabyBoomerメソッドの例
- Adapterの場合の例もあるが理解できず
参考
- Adapter
- 委譲
http://www.nurs.or.jp/~sug/soft/java/java32.htm
項目5 ガベージコレクトの穴に気をつける
廃れた参照とは?
- プログラムが使わないオブジェクトがメモリ上に保持されること
- 廃れた参照はガベージコレクトの対象にならない
廃れた参照が起こる例
- 配列でオブジェクトを保持する(参照する)場合
- キャッシュを実装する場合
配列の場合の対処法
- 参照にnullを代入する
- 参照が含まれた変数を再利用
- スコープ(変数が含まれるメソッド)の外に出る
キャッシュの場合の対処法
- WeakHashMapを使う
ツールを使ってみる
http://www.atmarkit.co.jp/fjava/rensai3/debug02/de...参考
- System.arraycopy
項目6 finalizerを使わない
finalizeメソッドとは?
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/l...より
finalize() このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。
またJLS(Java言語仕様書)によると
- finalizeが即座に実行されることを保証していない
- finalizeが実行される保証すらない
- finalizeの最中に発生した例外は無視される
finalizerのいたずら
- 長い間動いているアプリケーションがOutOfMemoryErrorで不可解に終了する例
finalizeの正当な使い方
- 明示的終了メソッドの補助として使う
- 重要でないネイティブ資源の解放
参考
明示的終了メソッドとは?
- InputStream、OutputStreamに対するcloseメソッドなど
- ローカルファイルシステムなどを指すようだ
その他
- 「Effective Java Reloaded」
- Java読書会のページ
2006年06月11日(日) 23:46:09 Modified by hacking_dubby