Lombokを利用する主な目的にJavaのお決まりのコード(ボイラープレートコード)を削減することがあげられます。
その目的のために頻繁に使用するアノテーションがいくつか存在しています。
本記事では利用頻度の高いアノテーションのいくつかをピックアップして概要を記載します
Lombokを用いてIDEで開発する場合は基本的にIDEにLombokをインストールしている必要があります。
IDEへのインストールについては以下エントリを参考にしてください
lombok.Data
対象クラスに@Data(lombok.Data)アノテーションを付与することで、メンバのgetter/setterが自動生成された(いわゆるJavaBeansを記載した)状態になります。
かつ、toString, equals, hashCode も適切にオーバーライドされます。
■@Dataアノテーションを付与したクラス
import lombok.Data; @Data public class Person1 { private long id; private String name; private int age; }
■IDEでの表示状態
コード上はメンバしか存在しないにも関わらず、アウトラインにはgetter/setter等が存在しています
■利用側のコード
コード上はgetter/setter等は存在しないクラスのgetter/setterが利用できます。
import sample.Person1; public class Person1Client { public static void main(String[] args) { Person1 p = new Person1(); p.setId(10001L); p.setName("LombokTaro"); p.setAge(25); System.out.println("Person1#getId: " + p.getId()); System.out.println("Person1#getName: " + p.getName()); System.out.println("Person1#getAge: " + p.getAge()); System.out.println("Person1#toString: " + p); } }
■実行結果
Person1#getId: 10001 Person1#getName: LombokTaro Person1#getAge: 25 Person1#toString: Person1(id=10001, name=LombokTaro, age=25)
■関連エントリ
lombok.Dataについては以下ページも参照ください。
lombok.Value
対象クラスに@Value(lombok.Value)アノテーションを付与すると、対象クラスのfinal化、メンバのfinal化、引数付きコンストラクタ、メンバのgetterが自動生成された状態(いわゆるImmutableなクラス)になります。
かつ、toString, equals, hashCode も適切にオーバーライドされます。
■@Valueアノテーションを付与したクラス
import lombok.Value; @Value public class Person2 { private long id; private String name; private int age; }
■IDEでの表示状態
コード上はメンバしか存在しないにも関わらず、アウトラインには引数付きコンストラクタ、getter等が存在しています
■利用側のコード
コード上getter等は存在しないクラスのgetterが利用できます。(setterは利用できません)
import sample.Person2; public class Person2Client { public static void main(String[] args) { long id = 1234500; String name = "LombokHanako"; int age = 34; Person2 p = new Person2(id, name, age); // setterは利用できない // p.setId(10001L); // p.setName("LombokTaro"); // p.setAge(25); System.out.println("Person2#getId: " + p.getId()); System.out.println("Person2#getName: " + p.getName()); System.out.println("Person2#getAge: " + p.getAge()); System.out.println("Person2#toString: " + p); } }
■実行結果
Person2#getId: 1234500 Person2#getName: LombokHanako Person2#getAge: 34 Person2#toString: Person2(id=1234500, name=LombokHanako, age=34)
lombok.Getter/lombok.Setter
対象クラスやメンバに@Getter, @Setterアノテーションを付与すると、クラス内のメンバのgetter/setterが自動生成された状態になります。
■@Getter, @Setterアノテーションを付与したクラス
アノテーションはメンバおよびクラスに付与することができます
import lombok.Getter; import lombok.Setter; // メンバにアノテーションを付与 public class Person3 { @Getter private long id = System.currentTimeMillis(); @Getter @Setter private String name; @Setter private int age; }
import lombok.Getter; import lombok.Setter; // クラスとメンバにアノテーションを付与 @Getter public class Person4 { private long id = System.currentTimeMillis(); @Setter private String name; @Setter private int age; }
■IDEでの表示状態
■利用側のコード
import sample.Person3; import sample.Person4; public class Person3and4Client { public static void main(String[] args) { Person3 p1 = new Person3(); p1.setName("LombokTaro"); p1.setAge(25); // p1.setId(10001L); <-- setterが存在しない System.out.println("Person3#id: " + p1.getId()); // id項目に対するgetterが存在する System.out.println("Person3#name: " + p1.getName()); // name項目に対するgetterが存在する // System.out.println("Person3#age: " + p1.getAge()); // age項目に対するgetterが存在しない Person4 p2 = new Person4(); p2.setName("LombokTaro"); p2.setAge(25); // p.setId(10001L); <-- setterが存在しない // クラス内の全メンバに対するgetterが存在する System.out.println("Person4#id: " + p2.getId()); System.out.println("Person4#name: " + p2.getName()); System.out.println("Person4#age: " + p2.getAge()); } }
■実行結果
Person3#id: 1474922349029 Person3#name: LombokTaro Person4#id: 1474922349033 Person4#name: LombokTaro Person4#age: 25