【超実用的】覚えておくべきLombokアノテーション7選

コードを自動生成してくれることで開発効率を上げてくれる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

@RequiredArgsConstructorfinalのついたフィールドのみを引数にとるコンストラクタを生成してくれるアノテーションです。

モデルクラスではなく、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を付与しておくとよいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です