はじめに
これから現場で働く新卒向けに、研修では習わなかったが現場ではよく使うアノテーション@Builder
についての記事を書くよ。まず初めに、lombokについて説明するよ。
lombokとは
lombok(ロンボック、ロンボクなどと呼ばれる)は、getter
やsetter
などを自動生成してくれる便利なライブラリだよ。筆者は、@Data
、@Value
、@Builder
をよく使っているよ。今回は、@Builder
にフォーカスして記事を書くよ。
eclipseでは、プロジェクトを立ち上げる際に依存関係に、以下のようにLombokを追加すると利用できるよ。
プロジェクトの立ち上げについて詳しく知りたい人は【図解】SpringBoot プロジェクトの立ち上げをみてね。
便利なアノテーション@Builder
では早速使っていくよ。新しいインスタンスを作るとき、通常はnew
でコンストラクタを使って作るけど、@Builder
を付けたクラスのインスタンスを作成するときは、コンストラクタを使わずにインスタンスを作成することができるよ。
初めに、インスタンスを作成したいクラスで、学籍番号id
と指名name
を持ったStudent
クラスを作成するとしたとき、通常はこんな感じ。
public class Student {
// コンストラクタ
Sample(int id, String name) {
this.id = id;
this.name = name;
}
/** 学籍番号 */
int id;
/** 指名 */
String name;
}
@builder
を使ったクラスの作成はこんな感じ。
@Builder
public class StudentBuilder {
/** 学籍番号 */
int id;
/** 学籍番号 */
String name;
}
基本的な造りは同じで、違いは@Builder
を書くことと、コンストラクタを書かない点だよ。
メリット
コンストラクタを使う場合では、クラスに新たに属性を追加したい場合に弱いよ。具体的には、パラメータの順番を変えたい、パラメータを増やしたい、減らしたい場合に弱く、チーム開発での修正が大変になるよ。また、常にパラメータの順番を意識しないといけないのが地味みつらい。。。
その点、@Builder
を使えば、項目を選んで設定する
だけなので、順番が変わったりパラメータが増えた場合でも目的の値をセットできるよ。
実際のインスタンスの作成はこんな感じ。
public class Main {
public static void main(String[] args) {
final int id = 1;
final String name = "Qiita";
// @Builderを用いなかった場合
final Student student = new Student(id, name);
// @Builderを用いた場合
final StudentBuilder studentBuilder = StudentBuilder.builder() //
.id(id) //
.name(name) //
.build();
}
}
ちなみに、パラメータを設定しなかった場合、デフォルト値が入っていそう。
(今回の場合だと、int -> 0, String -> nullといった感じに入っていた。)
まとめ
@Builder
は、コンストラクタなしにインスタンスの作成ができ、パラメータの変更などにも強いのでかなり便利。そして、メソッドチェーンで書けるので見やすくかっこいい。
ただし、パラメータが1つなど、少ない場合は可読性が下がるので通常のコンストラクタで書くのがよさそう。