Lombokの代表的なアノテーション


Javaの「Lombok」はボイラープレートをシンプルにしてくれるJavaのライブラリです。gettersettertoStringequalsなどを自動生成してくれます。

🗽 バリデーション

nullチェックを自動生成:@NonNull

@NonNullでメソッドの引数をアノテートすると、コンパイル時にnullチェックを自動生成してくれます。

public class Main {
public static void main(String... args) {
method("hoge");
method(null);
}
private static void method(@NonNull String value) { // valueをnullチェック
System.out.println(value);
}
}

🐰 メソッドの自動生成

ゲッター&セッターメソッド:@Getter@Setter

@Getterでゲッターメソッドを、@Setterでセッターメソッドを自動生成します。

  • @Getter引数のAccessLevelでアクセス制御を設定
  • @Getter引数のlazy=trueで値の初期化をゲッターメソッドが最初に呼ばれるまで遅延
public class Main {
@Getter @Setter
private String value1;
@Getter(AccessLevel.Private) // AccessLevelで公開範囲を設定できます
private String value2;
@Geter(lazy=true) // lazy=trueの場合は値の初期化をゲッタメソッド
public static void main(String... args) {
Main m = new Main();
System.out.println(m.getValue1()); //=> hogeを返す
}
}

クラスのtoStringメソッドを自動生成:@ToString

@ToStringでクラスをアノテーションするとtoString()メソッドを適切にオーバーライドしてくれます。

@ToString(exclude=ignore)
public class Main {
private int id = 100;
private String value = "hoge";
private List<String> list = Arrays.asList("fizz", "buzz");
private double ignore = 999;
public static void main(String[] args) {
System.out.println(new Main()); //=> Main(id=100, value=hoge, list=[fizz, buzz])
}
}
オプション 説明
callSuper 親クラスのtoStringを呼び出す
doNotUseGetters getterメソッドを使わずに各メンバにアクセス
exclude 表示しないフィールドを設定。逆はof
includeFieldNames フィールド名を含めないようにする
of 表示対象のフィールドを指定。

equalsとhasCodeメソッドを自動生成:@EqualsAndHashCode

@EqualsAndHashCodeでクラスをアノテートすると、equals()メソッドとhasCode()メソッドを自動生成します。

@EqualsAndHashCode
public class Main {
private int id = 100;
private String value = "hoge";
private List<String> list = Arrays.asList("fizz", "buzz");
public static void main(String[] args) {
Main a = new Main();
Main b = new Main();
System.out.println("a.hash = " + a.hashCode()); //=> a.hash = xxxx
System.out.println("b.hash = " + b.hashCode()); //=> b.hash = xxxx
System.out.println(a.equals(b)); //=> true
}
}

🍣 メソッドのサポート

スコープから抜けたらcloseを実行:@CleanUp

@CleanUpでローカル変数をアノテートすると、スコープから抜けるときにclose(任意)のメソッドを呼び出すことができます。

public class Main {
public static void main(String... args) {
@Cleanup Main m = new Main(); // close()メソッドを呼び出し
@Cleanup(dispose) Main m = new Main(); // dispose()メソッドを呼び出し
}
public void close() {
System.out.println("Called close method");
}
public void dispose() {
System.out.println("Called dispose method");
}
}

🍄 コンストラクタの生成

全フィールドを引数にもつコンストラクタ:@AllArgsConstructor

@AllArgsConstructor
public class Book {
private int id;
private String title;
}
Book main = new Book(1, "タイトル");

引数を持たないコンストラクタ:@NoArgsConstructor

@NoArgsConstructor
public class Book {
private int id;
private String title;
}
Book main = new Book();

final付きフィールド引数とするコンストラクタ:@RequiredArgsConstructor

@RequiredArgsConstructorをクラスにアノテートするとfinalのついたフィールドだけを引数に受け取るコンストラクタを自動で生成します。

@RequiredArgsConstructor
public class Book {
private String optionalSubTitle;
private final String requiredTitle;
}
Book main = new Book("必須のタイトル");

🐯 まとめてアノテーション

Getter/Setterをもつ値の設定:@Data

@Dataでクラスをアノテートすると@ToString@Getter@Setter@EqualsAndHashCode@RequiredArgsConstructorを設定したことになります。

@Data
public class Main {
private final String required;
private int number;
public static void main(String[] args) {
Main a = new Main(data);
a.setNumber(100);
Main b = new Main(data);
b.setNumber(100);
System.out.println("a = " + a);
System.out.println(a.equals(b));
}
}

Getterをもつ値の設定:@Value

@Valueでクラスをアノテートすると次の効果を得ることができます。

  • @ToString@Getter@EqualsAndHashCode@AllArgsConstructorが自動生成
  • クラス・各フィールドはfinalになる
  • 各フィールドはprivateになる
@Value
public class Main {
private String required;
}

🗻 ロガー SLF4Jを使う:@slf4j

ロガー「SLF4J」を使えるようにするアノテーションに@slf4jがあります。

@Slf4j
public class Main {
public static void main(String[] args) {
log.info("Hello SLF4J!");
}
}

ロガー側の出力は次のようになります。

[main] INFO xxx - Hello SLF4J!

🎃 boolean型のGetterメソッド:isXXX

boolean型のgetterメソッドはisXXXとなります。

public class Main {
@Getter @Setter
private boolean private;
public static void main(String... args) {
Main m = new Main();
System.out.println(m.isPrivate()); //=> falseを返す
}
}

🎳 補足:IntelliJでLombokを使えるようにする

  • IntelliJにLombokプラグインを導入
  • Project Lombokからlombok.jaをダウンロードして依存関係に追加
  • IntelliJのPreference > Compiler > Annotation Processorsを有効にする

IntelliJでLombok

🍮 参考リンク

📚 おすすめの書籍