Effective Java 2章

オブジェクトの生成と消滅を管理する


項目1 コンストラクタの代わりにstaticファクトリーメソッド


ファクトリメソッドの利点

  • 生成するオブジェクトを表す名前を持つことができる
  • 新たなオブジェクトを生成するのでは無く既存のオブジェクトを返すことができる
    • 不必要に重複したオブジェクトを生成しない
    • 常に同じオブジェクトを返すことで同値比較(==演算子)でオブジェクトを比べることができる
  • どんな型のオブジェクトでも返すことができる


ファクトリメソッドの欠点

  • 作ることができないオブジェクトが出てくる
    • 例えば、publicもしくはprotectedのコンストラクタを持たないクラスのサブクラスなど
  • コンストラクタに比べ、JavaDocの中で目立たない
    • 命名規則を用いてカバー
    • valueOf,getInstanceなど

まとめ

無条件にコンストラクタを使うのではなく、ファクトリーメソッドも検討してみよう


項目2 シングルトン特性を強調

シングルトンとは?

  • 常に1つのインスタンスしか存在しないクラスのこと

実装方法

  1. static finalなフィールドIを用意する
  2. フィールドIに自分自身のインスタンスを持たせる
  3. クラスがメモリ上に確保された時点でインスタンスが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.hellohiro.com/pattern/adapter.htm
  • 委譲
http://634.ayumu-baby.com/glossary/delegation.html
http://www.nurs.or.jp/~sug/soft/java/java32.htm

項目5 ガベージコレクトの穴に気をつける


廃れた参照とは?

  • プログラムが使わないオブジェクトがメモリ上に保持されること
  • 廃れた参照はガベージコレクトの対象にならない

廃れた参照が起こる例

  • 配列でオブジェクトを保持する(参照する)場合
  • キャッシュを実装する場合

配列の場合の対処法

  • 参照にnullを代入する
  • 参照が含まれた変数を再利用
  • スコープ(変数が含まれるメソッド)の外に出る

キャッシュの場合の対処法

  • WeakHashMapを使う

ツールを使ってみる

http://www.atmarkit.co.jp/fjava/rensai3/debug02/de...

参考
  • System.arraycopy
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/l...

項目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の正当な使い方

  • 明示的終了メソッドの補助として使う
  • 重要でないネイティブ資源の解放
このようなケース以外は使わないのが妥当ということで、このようなまれな場合のfinalizeの実装方法は必要に応じて参照してください。

参考
明示的終了メソッドとは?
  • InputStream、OutputStreamに対するcloseメソッドなど
ネイティブ資源とは?
  • ローカルファイルシステムなどを指すようだ

その他

  • 「Effective Java Reloaded」
http://journal.mycom.co.jp/articles/2006/05/18/jav...

  • Java読書会のページ
http://www.javareading.com/bof/index.html#effectiv...
2006年06月11日(日) 23:46:09 Modified by hacking_dubby




スマートフォン版で見る