コードを自動生成してくれることで開発効率を上げてくれるLombokですが、
僕自身が実際に業務で使っているアノテーションに絞って
業務での使い方と合わせてご紹介します!
この記事は、こんな人にオススメ!
・Lombokに興味がある
・存在は知っているけど、使いどころが分からない
導入方法
lombokを依存に加えるだけです!
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
覚えておくべきアノテーション7選
@Data
@Data
はGetterやSetterを自動生成してくれるアノテーションです。
また、フィールド変数をベースにtoString()
も書き換えてくれるのでログ出力にも役に立ちます。
// Getter, Setterを自動生成したいクラスに付与する
@Data
public class DataSample {
private String id;
private String name;
}
var sample = new DataSample();
sample.setId("dummy");
sample.setName("dummy");
sample.getId(); // dummy
sample.getName(); // dummy
sample.toString(); // DataSample(id=dummy, name=dummy)
また、equals()
もフィールド変数の比較結果に書き換えてくれるので、
まったく同じインスタンスでなくても変数の中身(例えば文字列)が一緒であればオブジェクトも等しいと見なされます!
var sample1 = new DataSample();
var sample2 = new DataSample();
sample1.equals(sample2); // true
強力なアノテーションなのですが、スレッドセーフの観点から次の@Value
を基本的に使用することをオススメします。
ただ、引数なしコンストラクタとSetterがどうしても必要な場合は@Data
を使いましょう!
@Value
@Value
はGetterと全フィールド変数を引数に取るコンストラクタを自動生成してくれるアノテーションです。
モデルクラスにはとりあえず全部@Value
をつけておけば良いくらいに便利です!
// Getter, コンストラクタを自動生成したいクラスに付与する
@Value
public class ValueSample {
private String id;
private String name;
}
// setterの代わりにコンストラクタで変数を受け取る
var sample = new ValueSample("dummy_id", "dummy_name");
sample.getId(); // dummy_id
sample.getName(); // dummy_name
sample.toString(); // ValueSample(id=dummy_id, name=dummy_name)
また、equals()
もフィールド変数の比較結果に書き換えてくれるので、
まったく同じインスタンスでなくても変数の中身(例えば文字列)が一緒であればオブジェクトも等しいと見なされます!
var sample1 = new ValueSample("dummy_id", "dummy_name");
var sample2 = new ValueSample("dummy_id", "dummy_name");
sample1.equals(sample2); // true
@Data
との大きな違いは、変数を「Setterで設定するのか」「コンストラクタで設定するのか」で、
スレッドセーフの観点から「コンストラクタで設定」が必要な@Value
がオススメです。
@RequiredArgsConstructor
@RequiredArgsConstructor
はfinal
のついたフィールドのみを引数にとるコンストラクタを生成してくれるアノテーションです。
モデルクラスではなく、SpringBootでBean登録するようなクラスとセットで使うとよいと思います。
@Component
// コンストラクタを生成したいクラスに付与する
@RequiredArgsConstructor
public class RequiredArgsConstructorSample {
// finalで定義するので、Bean生成後書き換えられることがない
private final ObjectMapper objectMapper;
}
コンストラクタを生成するアノテーションに@AllArgsConstructor
もあるのですが、final
を強制できないのでフィールド変数を上書きの可能性があります。
(こんな実装する人いないと信じたいですけどね…)
スレッドセーフの観点からBean登録するクラスのフィールド変数はfinal
で定義すべきなので、@RequiredArgsConstructor
を使うようにしましょう。
@SneakyThrows
@SneakyThrows
は例外をすべてRuntimeException
に丸め込んでくれるアノテーションです。
try – catchやthrowを書かなくて良くなるので細かい例外ハンドリングを行う必要がない場合はオススメです。
// 例外が発生する可能性のあるメソッドに付与する
@SneakyThrows
public void sample() {
throw new Exception();
}
@NonNull
@NonNull
はNullチェックを自動で追加してくれるアノテーションです。
フィールド変数や引数に付与することで、該当の変数がnullの場合に例外を出力してくれます。
// nullチェックを行いたい引数に付与する
public void execute(@NonNull Object obj) {
// something to do
}
new NonnullSample().execute(null);
// java.lang.NullPointerException: obj is marked non-null but is null
@Value
public class NonNullModel {
// non nullを確約したいフィールドに付与する
@NonNull
private String id;
}
new NonNullModel(null);
// java.lang.NullPointerException: id is marked non-null but is null
@Slf4j
@Slf4j
はロガーを自動で生成し使えるようにしてくれるアノテーションです。
log
というフィールドにloggerが登録されているので、log.info("ログメッセージ")
というように使用します。
// ロガーを利用したいクラスに付与
@Slf4j
public class Slf4jSample {
public void sample() {
var message = "hello, world.";
log.info("message: {}", message);
// 11:17:31.555 [Test worker] INFO hirabay.lombok.sample.Slf4jSample - message: hello, world.
}
}
ログメッセージに変数を埋め込みたい場合は、
実装例のように{}
をメッセージに含めて引数に埋め込みたいオブジェクトを指定すればOKです!
複数埋め込みたい場合は、{}
の記載順に引数を設定すればOKです!
log.info("{}, {}.", "Hello", "world"); // Hello, world.
@Builder
@Builder
はbuilderパターンでオブジェクトの生成ができるようになるアノテーションです。
@Value
でコンストラクタの引数が多いと何番目の引数に何を渡せばよいのか良くわかなくなってしまいますが、@Builder
を使うとフィールド名を指定してオブジェクトを渡せるようになるので書きやすいし読みやすいです!
// builderパターンでオブジェクト生成したいクラスに付与
@Builder
@Value
public class BuilderSample {
// 必須で値を設定すべきフィールドにはNunNullを付与
@NonNull
private String id;
private String name;
}
BuilderSample.builder()
.id("dummy_id")
.name("dummy_name")
.build();
注意点としては、フィールドの設定忘れがあってもコンストラクタと違いコンパイルエラーにはならないので、
実装例のように必須でオブジェクトを設定すべきフィールドには@NonNull
を付与しておくとよいです。