関連リンク
http://d.hatena.ne.jp/amachang/20100215/1266245521
項目1 コンストラクタの代わりにstaticファクトリーメソッドを検討する
- コンストラクタ
public class Car {
//クラス変数
public static int createdCar = 0;
//インスタンス変数
public int adultNum;
//車を作るときのコンストラクタ
Car() {
this.adultNum=4;
Car.createdCar += 1;
}
//adultNum人乗りの車を作るコンストラクタ
Car(int adultNum) {
this.adultNum = adultNum;
Car.createdCar += 1;
}
public static Car newInstance() {
this();
}
}
- staticメソッド
≒クラスメソッド:クラスに属するメソッド。クラス一つにつき一つしか存在しない。インスタンスがなくても使える
↔インスタンスメソッド:インスタンスに属するメソッド。クラス一つにつき複数存在する。インスタンスがないと使えない
- コレクションフレームワーク
HashMap, ArrayListとか
Good
好きな名前を付けられる(コンストラクタのオーバーロードはわかりづらい)
オブジェクトの生成が制御出来る(オブジェクトの生成はコスト)
オブジェクト生成の制御はenumで!
戻り値の型のサブタイプのクラスを返せる
コンストラクタだとそのクラス自体しか返せない
オブジェクトの生成が(場合によっては)シンプル(guavaライブラリ)
型パラメータ2回も書くのしんどいです><
Bad
privateなコンスタクタを持つクラスのサブクラス作れない
コンストラクタでやっても同じなような?
他のメソッドと名前で区別できない
ファクトリメソッドだよ!ってわかる名前を付けよう
valueOf, of, getInstance, newInstance, getType, newType
- コンポジション
項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する
名前付き引数っぽくてかっこいい!
項目3 privateのコンストラクタかenum型でシングルトン特性を強制する
シングルトンはテストしづらいか使っちゃだめ
シングルトン作るならenum型使うのがベスト
public enum PropertiesCarrer {
INSTANCE("env.properties");
private bundle;
private String name;
public PropertiesCarreer(name) {
bundle = ResouceBundle.getBundle(name);
}
public ResouceBundle getBundle() {
return bundle
}
}
PropertiesCarrer.INSTANCE.getBundle();
項目4 privateのコンストラクタでインスタンス化不可能を強制する
コンストラクタをprivateにして、インスタンス化させない(ex シングルトンとか、Utilクラスとか)
- UtilクラスとService
Utilsクラス
クラスメソッドのみからなるクラス、クラス名.メソッド()みたいに呼ぶ
ステートレス
Serviceクラス
インスタンスメソッドからなるクラス、インスタンス.メソッド()みたいに呼ぶ
ステートフルにできるが、、Spring, SAStrutsではシングルトンオブジェクトなので、ステートレスに作ったほうが良い
項目5 不必要なオブジェクトの生成を避ける
オブジェクトの生成はコストが掛かる
なんでもかんでもnewしない、オブジェクトを再利用を出来ないか考える
落とし穴→SimpleDateFormat
非スレッドセーフなオブジェクト(状態を持つオブジェクト)を複数スレッドで共有すると、バグる
→なんでもかんでも、再利用するべきじゃない
Mapとかは明らかに状態を持つってわかるけど、sdfは直感的に状態持つ感じしないよね。。。
項目6 廃れたオブジェクト参照を取り除く
オブジェクトはいつ死ぬと思う?
Stackさんが配列で過去に作られた全てのオブジェクトへの参照をしてるので、参照カウントが0にならない。
なんでもかんでもnullにするのはだめ、
項目7 ファイナライザを避ける
C++ユーザー:えーデストラクタないのーダサーい
リソースの回収はfinallyでやってね
じゃあいつ使うの?
今でしょリソースが解放されなかった時の保険として使われてるらしいよ
2日目(3章はこちら)↓
http://qiita.com/qwerty__/items/bb40ca48674bcbbe98bd