突っ走り書き

見せるほどのものでは..

デフォルトコンストラクタではすべてのフィールドを引数として受け取るべき

Java & オーバーロード & コンストラクタ

Javaでは,オーバーロードによって複数コンストラクタを定義できます.
例えば,Personの集合を表すPeopleクラスには,次のコンストラクタがあります.

public People {

    private Set<Person> people;

    public People() {
        this.people = new HashSet<Person>();
    }
}

このコンストラクタでは,this.people に HashSet のインスタンスを代入して,
フィールドの初期化をしています.

デフォルトコンストラクタの引数で,すべてのフィールドを初期化するべき

で,今回は,次のようなコンストラクタのほうがいいかもって話.

public People {

    private Set<Person> people;

    public People(Set<Person> people) {
        this.people = people;
    }

    public People() {
        this(new HashSet<Person>());
    }

    public People(int capacity) {
        this(new HashSet<Person>(capacity));
    }
}

まず,デフォルトコンストラクタでは,すべてのフィールドをコンストラクタの引数で初期化します.
People クラスでは,Set<Person> 型の引数とするコンストラクタをもちます.
もし,他のコンストラクタが欲しいときは this(...) でオーバーロードします.
デフォルトコンストラクタですべてのフィールドを初期化できるので,
this(...) でコーディングできるはずです.
この結果,改良版People では,

  • new People();
  • new People(10);

といったコンストラクタを公開しています.

テスト駆動開発のとき

このようにデフォルトコンストラクタを定義しておくと,
TDDでテストコードを書くときに,モックを渡しやすくなります.
すべてのフィールドを引数として受け取るコンストラクタから始めれば,
あとあと面倒なこと巻き込まれずに済みそうです.