【Java】オブジェクトの生成方法
ゴール
- Builderパターンを理解する
- オブジェクトの生成方法を整理する
実行環境
Builderパターンとは
オブジェクトを生成するためのデザインパターン。
GoFのBuilderパターンはDirectorとBuilderを使って、オブジェクトの生成を柔軟に変更できる。
が、それが必要になるケースはあまりない気がする。
Lombokの@Builderが簡単に適用できていい感じ。
オブジェクトの生成方法
Lombokを使う。
LombokはGetter/Setterやコンストラクタを自動生成してくれるので、ボイラープレートコードを排除できる。
mavenであれば、pomにlombokを追加するだけでOK。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency>
Constructorでオブジェクトを生成する
@Value public class Sample { private String filed1; private String filed2; private String filed3; }
class SampleTest { @Test public void test() { Sample sample = new Sample("フィールド1", "フィールド2", "フィールド3"); } }
メリット
デメリット
- どのフィールドに何を設定するかが不明確になる
- フィールド(引数)が増えると分かりづらくなる
Setterでオブジェクトを生成する
@Getter @Setter public class Sample { private String filed1; private String filed2; private String filed3; }
public class SampleTest { @Test public void test() { Sample sample = new Sample(); sample.setFiled1("フィールド1"); sample.setFiled2("フィールド2"); sample.setFiled3("フィールド3"); } }
メリット
- どのフィールドに何を設定するかが明確になる
- オブジェクト生成後に任意のタイミングで値を設定(変更)できる
デメリット
Builderでオブジェクトを生成する
@Value @Builder public class Sample { private String filed1; private String filed2; private String filed3; }
public class SampleTest { @Test public void test() { Sample sample = Sample.builder() .filed1("フィールド1") .filed2("フィールド2") .filed3("フィールド3") .build(); } }
メリット
- どのフィールドに何を設定するかが明確になる
- オブジェクトをイミュータブルにできる
- オブジェクト生成をワンライナーで書ける
デメリット
- フィールドの設定をコンパイラに強制できない