はじめに
今回は、業務で実際によく見かけるアノテーションをまとめるよ。この記事でまとめるアノテーションは、@Data、@Value, @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructorの5つだよ。
@RequiredArgsConstructor
finalなフィールドを初期化するコンストラクタが生成されるよ。逆にfinalをつけないとインジェクションされないよ。
実際にコードを書くよ。@RequiredArgsConstructorを利用して作成したクラスは以下のようになるよ。
@RequiredArgsConstructor
public class Student {
private final Integer id;
private final String name;
private String club;
}
これは、以下のようなコードと同じになるよ。
public class Student {
private final Integer id;
private final String name;
private String club;
// @RequiredArgsConstructorで作成されるコンストラクタ
public Sample(Integer id, String name) {
this.id = id;
this.name = name;
}
}
@NoArgsConstructor, @AllArgsConstructor
@NoArgsConstructorは、デフォルトコンストラクタを自動で生成してくれるよ。@AllArgsConstructorは、全フィールドを初期化するコンストラクタが生成されるよ。この2つのアノテーションはよくセットで使われることがあるよ。
またまた、アノテーションを使ったクラスを作るよ。
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private final Integer id;
private final String name;
private String club;
}
これは、以下のようなコードと同じになるよ。
public class Student {
private final Integer id;
private final String name;
private String club;
// @NoArgsConstructorで作成されるコンストラクタ
public Sample() {
}
// @AllArgsConstructorで作成されるコンストラクタ
public Sample(Integer id, String name, String club) {
this.id = id;
this.name = name;
this.club = club;
}
}
@Value
lombok#@Daraによると、@Valueは以下のアノテーションを付与したのと同じ状態になるようだよ。@Valueを付与すれば、イミュータブルなオブジェクトを作成できるよ。
@Getter@ToString@EqualsAndHashCode@AllArgsConstructor- 全てのフィールドが
privateかつfinalになる - クラスは
finalになる
@Valueを使ってクラスを作ってみると、こんな感じ。
@Value
public class Student {
Integer id;
String name;
String club;
}
@Valueを使わないと以下のようなイメージ。
final public class Student {
private final Integer id;
private final String name;
private final String club;
public Sample(Integer id, String name, String club) {
this.id = id;
this.name = name;
this.club = club;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getClub() {
return club;
}
}
@Data
lombok#@Valueによると、@Dataは以下のアノテーションを付与したのと同じ状態になるようだよ。
@Getter@Setter@ToString@EqualsAndHashCode-
@RequiredArgsConstructor
おもにgetter,setterを必要とするクラスに付与すると思っていたら良さそうだよ。
クラスを作成すると、こんな感じ。
@Data
public class Student {
private Integer id;
private String name;
private String club;
}
@Dataを使わないと以下のようなイメージ。
public class Student {
private Integer id;
private String name;
private String club;
public Sample(Integer id, String name, String club) {
this.id = id;
this.name = name;
this.club = club;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClub() {
return club;
}
public void setClub(String club) {
this.club = club;
}
}
まとめ
lombokの便利な機能を使って、開発効率を上げていこう!
ただし、イミュータブルにしたいのに@Dataを付与したり、@Valueと@AllArgsConstructorを同時に付与して不要なものを付けたりしないように注意しよう。