はじめに
実務1ヵ月たったところで、備忘録として残しておくため投稿させていただきました。
今回はDto作成する際にでてきたBuilderについて調べてました。
Builderパターンとは
代表的なBuilderパターンは二つあって、一つはGoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つであって、Builderパターンはその中でも__「作成系」デザインパターン、オブジェクト作成メカニズムを扱うデザインパターン__です。オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にすることが目的です。
もう一つは「Effective Java」による、Builderパターンでしょう。こちらは、コンストラクタに多数のコンストラクタ引数が必要になった場合に検討するパターンとして紹介されています。
これだけだとなんかよくわからないため深堀していくと...
そもそもBuilderパターンとはソフトウェア開発におけるデザインパターンまたは設計パターンの一つであって、過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものであることがわかりました。
例えば車を購入するとき。車に製造過程で車種が決まり、オプションをつけることで車に個性をつけることができるため、
必要に応じて柔軟に車を作ることができることができるようになるのがBuilderパターンを使うメリットになります。
なので、コンストラクタに対して数多くのパラメータをセットする必要がある時に、代わりに使うことが推奨されている実装方法であることがわかりました。
@Builder(Lombok)の使い方
Builderの作成方法はいろいろありますが、今回はDto作成などに便利なLombokのBuilderパターンについてまとめてみました。
- JavaのClassに@Builderを付与するだけでBuilderメソッドを生成してくれる。
- クラスに @Getter を付けると全プロパティにGetterが追加されるのでDtoなどを作るときは非常に便利
// 呼び出される側
@Getter
@Builder {
public AudioPlayerDto {
private int playerId;
private String sound;
private String music;
}
// 呼びさす側
AudioPlayerDto audioPlayer = AudioPlayerDto.builder() //Builderを生成
.playerId(100) // プロパティをセット
.sound("Off")
.music("pop")
.build(); // インスタンスを生成
Builderを使うメリット
ビルダパターンでは値を設定する時にフィールド変数名に対応するメソッドを呼び出すためIDEによる補完が効きやすくコーディングが楽になります。コードを後から読むときにもメソッド名からどのフィールド変数へ値を設定しているかも分かりやすいです.
- メソッドチェーンでプロパティを初期化できるため、変数名を毎回書かずに済むこと。
- どのプロパティを初期化しているかわかりやすく、初期化する順番も自由に決められること。
** Builderパターンを使わなかった場合 **
- Setterでセットすると毎回変数名を書く必要があって生成するインスタンスが多いとめんどう
- 引数を書く順番も決まっていて、引数が多いて順番を覚えておくのが大変。
final var AudioPlayerDto = new AudioPlayerDto();
AudioPlayerDto.setPlayerId(100);
AudioPlayerDto.setSound("off");
AudioPlayerDto.isMusic("pop");
AudioPlayerDto.hoge ・・・
final var AuditoPlayerDto = new AuditoPlayerDto(102, on, jazz, hoge, ・・・);
最後に
まだまだ捉えきれていないところもありますが、Builderパターン以外にも様々な実装方法が設計思想をもとにあるみたいたので引き続き学習していきたいと思います。