Lombokの本質
例えば、生Javaで人間を表すクラスを作成するとする
public class Person {
private String name; //privateはこのクラスからしかアクセスできないという意味。
private int age;
}
この生Javaの場合、getterやsetterは自分で記載しないといけない。
これを毎回書くのは面倒。
以下は、Lombokなしでコンストラクタ、getterやsetterを書いた場合
pulic class Person {
private String name;
private int age;
//コンストラクタ
public Person(String name,int age) {
this.name = name;
this.age = age;
}
//getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
上記のように、getter・setter・コンストラクタを毎回書くとコードが長くなり、冗長になりやすいです。
そこでLombokの登場。Lombokを使用すると、上記のコードを以下のように簡潔に書ける。
import lombok.Data;
import lombok.AllArgConstructor;
@Data
@AllArgConstructor
public class Person {
private String name;
private int age;
}
各アノテーションの意味
| アノテーション | 役割 |
|---|---|
@Data |
getter / setter / toString / equals / hashCode を自動生成する |
@AllArgsConstructor |
すべてのフィールドを引数に取るコンストラクタを自動生成する |
Lombokの仕組み
Lombokはコンパイル時にコードを自動生成してくれます。
だから、ソースコード上では短くても、実際にコンパイルされたクラスファイルにはgetter/setter/toStringなどが含まれています。
Lombokが内部で生成してくれるコード(実際はこんな感じ)
public class Person {
private String name;
private int age;
// コンストラクタ
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter
public String getName() { return name; }
public int getAge() { return age; }
// setter
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
// toString, equals, hashCode も自動生成される
}
復習 コンストラクタについて
コンストラクタとは
オブジェクトを作るときに最初に呼ばれる特別なメソッドのことです。
たとえば次のコード:
Person p = new Person("けい",28)
このとき呼ばれているのが 👇
public Person(String name,int age) {
this.name = name;
this.age = age;
}
ここで Person(...) の部分が コンストラクタの呼び出し です。
つまりコンストラクタは、「そのオブジェクトがどんな初期状態で生まれるか」を決める役割を持っています。
コンストラクタの書き方
//基本形
public クラス名(引数リスト) {
// 初期化処理
}
なぜコンストラクタが必要なのか
理由①:オブジェクトに初期値を与えるため
Person p = new Person("けい", 28);
こうすることで、p は「名前がけいで年齢28歳の人」として作られます。
理由②:オブジェクトを作る瞬間に処理を入れられる
public Person(String name, int age) {
System.out.println("新しい人を作りました!");
this.name = name;
this.age = age;
}
@AllArgsConstructorについて
Lombok が「全フィールドを引数に取るコンストラクタ」を自動生成してくれる アノテーションです。
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Person {
private String name;
private int age;
}
Lombokが裏で自動生成するコード
public class Person {
private String name;
private int age;
// 👇 @AllArgsConstructor によって自動生成されるコンストラクタ
public Person(String name, int age) {
this.name = name;
this.age = age;
}