Lombokはいいぞ

Lombokとは

いい感じにAnnotaitionで、Javaのよく出てくる処理を書いてくれるやつ。
使うと世界が変わる。

網羅的にざっと書きます。

共通テク

うまくいかなかったらIDEのDelombokでバラして考えてみる。
ドキュメントも充実している。

よく使う

@Getter, @Setter

https://projectlombok.org/features/GetterSetter

名前の通りGetter,Setterを自動で作ってくれる。
クラスにもフィールドにも使用可能で、final修飾されたフィールドのSetterはもちろん作られない。

@Getter @Setter
public class Hoge {
    private int val;

    // ここにgetVal(), setVal(int val)みたいなのが作られるイメージ
}

フィールドだと、

public class Hoge {
    @Getter @Setter
    private int val;
}

残念ながらsynchronized相当のものは作れない。

@ToString

https://projectlombok.org/features/ToString

クラスの先頭につけると、toStringのオーバーライドメソッドがいい感じに生成される。
迷ったらつけとけばいいと思う。

@ToStirng
public class Hoge {
    private int val;
    private String hoge;

    // @Override public String toString() が生成される
}

循環参照でハマったりしてtoStringで出したくないフィールドがあるときは、

@ToString
// あるいはここで、@ToString(exclude = "secret")
public class Hoge {
    private int val;
    @ToString.Exclude private String secret;
}

こんな感じで指定する。

@EqualsAndHashCode

https://projectlombok.org/features/EqualsAndHashCode

equalsを用意するときにはhashCodeも用意しようということで、いっぺんにやってくれるやつ。
迷ったらつける。

@Data

https://projectlombok.org/features/Data

ここまでやった奴を全部つけてくれるアノテーション
@Setter@Getter@ToString@EqualsAndHashCode@RequiredArgsConstructorをつけてくれる。

@Data
public class Hoge {
    private int var;
    private String hoge;

    // get, set, toString, equals, hasCode, canEqualsができる
    // この場合Hoge()もできる。詳細は後述
}

めんどくさいときは、これだけつけておけばOK。
@RequiredArgsConstructorについては後述。

@xxxArgsConstructor

https://projectlombok.org/features/constructor

  • @NoArgsConstructor
  • @AllArgsConstructor
  • @RequiredArgsConstructor

この3種類がある。 クラスの先頭につけると、 @NoArgsConstructorは引数なしのコンストラクタ、 @AllArgsConstructorは全てのフィールドと対応する引数を持つコンストラクタを生成する。

@RequiredArgsConstructorfinalフィールドに対してのみ初期化を行うコンストラクタを生成する。

@RequiredArgsConstructor
public class Hoge {
    private final int val;
    private String hoge;

    /*
    このようなコンストラクタができる
    public Hoge(int val) {
        this.val = val;
    }
    */
}

@NonNull

https://projectlombok.org/features/NonNull

nullチェックを生成する。引数にnullが入ってきた時点でNullPointerExceptionを吐いて落とす。
引数が多くなってくると、nullチェックも多くなってくるのでアノテーションでできると便利。

// nullが入ってきたら中に入る前に落としてくれる
pubilc void hoge(@NonNull final String message) {
    message.hashCode();
}

知らなくても困らないやつ

@Builder

https://projectlombok.org/features/Builder

Builderパターンを自動生成する。

@Builder
public class Hoge {
    private int val;
    private String name;

    // ごちゃごちゃBuilderパターンができる
}

使うときは、

Hoge hogehoge = Hoge.builder()
    .val(1)
    .name("a")
    .build();

TPOに合わせて使うと便利かも。

@SneakyThrows

https://projectlombok.org/features/SneakyThrows

問題児

チェック例外を非チェック例外をとして、ある意味握りつぶす。
使いどころは、コード上チェック例外が起こり得ないけど、Javaの仕様的にtry catchを書くのを強いられて、めんどくさい時(ということだと思う)。

rethrowみたいなの自作する時とかにも使えるかもしれない…。

普通に実装するのも、そんなに大変ではなさそう。

@SuppressWarnings("unchecked")
public static <E extends Throwable> void sneakyThrow(Throwable e) throws E {
    throw (E) e;
}

@Slf4j

つけるとSlf4jのloggerを作ってくれる。

@Slf4j
public class Hoge {
    // これができる
    // private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Hoge.class);
}

ありがたみが薄い。

まとめ

Lombok使うとJavaが楽しくなります。