LoginSignup
40
35

More than 5 years have passed since last update.

EffectiveJava読書会1日目

Last updated at Posted at 2014-04-10

関連リンク
http://d.hatena.ne.jp/amachang/20100215/1266245521

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

  • コンストラクタ
Car.java
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型使うのがベスト
singleton.java
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 廃れたオブジェクト参照を取り除く

オブジェクトはいつ死ぬと思う?
alt
Stackさんが配列で過去に作られた全てのオブジェクトへの参照をしてるので、参照カウントが0にならない。
なんでもかんでもnullにするのはだめ、

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

C++ユーザー:えーデストラクタないのーダサーい
リソースの回収はfinallyでやってね

じゃあいつ使うの?

今でしょリソースが解放されなかった時の保険として使われてるらしいよ

2日目(3章はこちら)↓
http://qiita.com/qwerty__/items/bb40ca48674bcbbe98bd

40
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
35