はじめに
今回は、業務で実際によく見かけるアノテーションをまとめるよ。この記事でまとめるアノテーションは、@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を同時に付与して不要なものを付けたりしないように注意しよう。
