【Java】オブジェクトの生成方法

ゴール

  • Builderパターンを理解する
  • オブジェクトの生成方法を整理する

実行環境

Builderパターンとは

オブジェクトを生成するためのデザインパターン

GoFのBuilderパターンはDirectorとBuilderを使って、オブジェクトの生成を柔軟に変更できる。

が、それが必要になるケースはあまりない気がする。

Lombokの@Builderが簡単に適用できていい感じ。

www.techscore.com

qiita.com

retheviper.github.io

qiita.com

sebenkyo.com

オブジェクトの生成方法

Lombokを使う。

LombokはGetter/Setterやコンストラクタを自動生成してくれるので、ボイラープレートコードを排除できる。

mavenであれば、pomにlombokを追加するだけでOK。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

blog.y-yuki.net

blog.y-yuki.net

blog.y-yuki.net

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();
    }
}

メリット

  • どのフィールドに何を設定するかが明確になる
  • オブジェクトをイミュータブルにできる
  • オブジェクト生成をワンライナーで書ける

デメリット