Java のコード量を激減できる lombok がスゴイ

きしださんのブログで知った lombok という Java のライブラリがスゴイ。
http://projectlombok.org/

指定されたアノテーションを付与することで、下記のようにメソッドを生成してくれる。

これを用いると、Java のコード量をかなり減らせることができる。

例1 setter, getter を自動生成したい場合

import lombok.Getter;
import lombok.Setter;

public class Person {

    @Setter
    @Getter
    private String name;

    @Setter
    @Getter
    private int age;
}

このように、setter と getter を自動生成させたいフィールドに @Setter, @Getter を付与する。もちろん片方だけでもOK。
@Getter をつけたフィールドは getter のみ自動生成される。

上記のコードは下記のように、普通に動く。

Person p = new Person();
p.setName("aoking");
p.setAge(26);
System.out.println(p.getName()); // -> aoking
System.out.println(p.getAge()); // -> 26

例2 toString の自動生成

上記の Person クラスに toString メソッドを実装したい時、自前で ToStringBuilder なんかを使って書くことが多かったが、@ToString をクラス名につければ OK。

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString
public class Person {

    @Setter
    @Getter
    private String name;

    @Setter
    @Getter
    private int age;
}

すると・・・

Person p = new Person();
p.setName("aoking");
p.setAge(26);
System.out.println(p); // -> Person(name=aoking, age=26)


うむ。便利。

例3 hashCode/equals の自動生成

@EqualsAndHashCode でいい感じのコードを自動生成してくれます。

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@ToString
@EqualsAndHashCode
public class Person {
    @Setter
    @Getter
    private String name;

    @Setter
    @Getter
    private int age;
}

例4 Bean

前述の例で使った Person クラスは単なる Bean。Bean には @Setter @Getter @ToString @EqualsHashCode をつけなくとも、@Data 一個で OK。
なんとシンプル!

@Data
public class Person {
    private String name;
    private int age;
}

例5 不変クラス

Person を不変クラスにしたい場合。フィールドを final にして、@Value をクラス名に付与すれば OK。

import lombok.Value;

@Value
public class Person {
    private final String name;
    private final int age;
}

使い方

Person p = new Person("aoking", 26);
System.out.println(p.getName()); // -> aoking
System.out.println(p.getAge()); // -> 26
System.out.println(p); // -> Person(name=aoking, age=26)


基本的にはここまでの @Setter, @Getter, @ToString, @EqualsHashCode, @Data, @Value を抑えておけばかなりのコード量を削減できる。
自動生成可能なコードを削減出来るということは、そうではないコード(いわゆるロジック)の密度が上がり、ロジックに集中してコードを書くことができる。

特に @Data, @Value がどれだけコードを削減できているのかについて、公式ドキュメントを参照して欲しい。
http://projectlombok.org/features/Data.html
http://projectlombok.org/features/Value.html

さて、その他の lombok の機能。

val

こいつはスゴイ。型推論のような機能。

List<Map<Integer,String>> のような型がある時にはかなり役立ちそう。

val example = "hello world";
System.out.println(example); // -> hello world

val list = new ArrayList<String>();
list.add("message");

System.out.println(list.get(0)); // -> message

@Log

@Log を付与すると、log という名前のロガーが用意される。
ロギングライブラリごとにアノテーションが用意され、log4j なら @Log4j, slf4j なら @Slf4j が用意されてたりする。

@Cleanup

リソース変数 (Reader とか InputStream とか)にこのアノテーションを付与すると、自動的に close してくれる。
close でない場合はメソッド名を指定できるので、実質どんな変数に対しても割り当て可能。try-with-resources より便利かも?

まとめ

スゴイの一言に尽きる。
この勢いで、ラムダ記法を用意してくれないかな。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)