2014年04月13日

復習:Effective Java第二章

Effective Java輪読会 vol.0の復習です。



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

これは、「オブジェクトを生成→コンストラクタを使う」という思い込みを壊す目的の話かな、と。

現状をふまえてメリット・デメリットをまとめると、
・機能を考慮した命名が可能
・内部実装では、必ずしも新たなオブジェクトを作らなくても良い
・内部実装では、サブクラスのインスタンスを返却しても良い(使用者はそれを知る必要がない)
・Javadoc上で、static ファクトリメソッドはそれ以外のメソッドと混ざってしまう(※対策として、標準の命名規約に従おう)
といったところですね。

脱線した話題としては、

・言語によってはインスタンス生成でも命名自由度あるよね(例:Objective-Cのイニシャライザ)
・Java5.0〜6では型パラメータを指定してオブジェクトを生成するときの型指定面倒だったけれど、Java7でダイヤモンド演算子導入されたよね
・static ファクトリーメソッドだとサブクラスが作成出来ないけど、継承じゃなくてコンポジションにすれば良いよね(Delegateパターン使うとか良いよね)
・サブクラスが作れない例はコレクションフレームワークにあるっていうけれど、どれよ!?
・ConcurrentHashMap.KeySetView(※This class cannot be directly instantiated.)
・EnumSet(※コンストラクタが存在してない模様)





項目2 数多くのコンストラクタパラメータに直面したときはビルダーを検討する

コンストラクタに無数の引数があると大変です。それらが省略可能というのもしばしば...

まず第一の例に挙げられたテレスコーピングコンストラクタ…名前は初耳でしたが、よく見たパターンでした。機能するけれど、読み書き大変というのもよくわかります。
そして、次の例に挙げられたJavaBeansパターン。今度は読み書きが良くても不整合が出るリスクがありますね。スレッドセーフにするのも大変だと思います。
最後にBuilderパターン。Builderパターンを作るのは面倒ですね。でも、使うのは楽ですし、使われているのを読むのも楽ですね。
しかしまあ、私が業務で書く事もあるVB.Netでは、名前付き引数とOptional引数あります。それだとこんな苦労要らない話が。。。




項目3 privateのコンストラクタかenum型でシングルトン特性を強制する

enumシングルトンというのは初めて知りました。単一要素を持つenum型を作る事で、シリアライズ攻撃やリフレクション攻撃でも複数のインスタンス生成を阻止出来るというのは便利ですね。




項目4 privateのコンストラクタでインスタンス化不可能を強制する

public staticメソッドしか持たないユーティリティクラスをインスタンス化出来ないように、privateコンストラクタを作っておく等…は、当然な気がします。ただ、念のためでAssertionErrorをthrowしておくというのは納得




項目5 不必要なオブジェクトの生成を避ける
オブジェクト生成コストがいくら小さいと言っても、String s = new String("hogehoge");のように新しいオブジェクトを作らないようにするべきなのは当然だと思ってました。。。

ただ、オートボクシングにより不要なデータ型が出来てしまう事があるのは、気づいていませんでした。

処理数が少なければコレによる処理劣化は誤差範囲だと思いますが。。。




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

配列等を使って、自前でデータキャッシュしようとしたりすると、参照の解放を忘れてしまうケースがあるような。。。

WeekHashMapを使えば”弱い参照”、としてメモリ管理が楽になりそう。




項目7 ファイナライザを避ける

「finalizeメソッドをオーバーライドするな!」で、話は終了。。。

一応例外的に使っても良いパターンが書いてありますが、レアケースの例外だと思いました。
タグ:JAVA
posted by tksy at 18:19| Comment(0) | 自宅学習
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: