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でテストコードを書くときに,モックを渡しやすくなります.
すべてのフィールドを引数として受け取るコンストラクタから始めれば,
あとあと面倒なこと巻き込まれずに済みそうです.