lombokでよく使うアノテーション

## はじめに
今回は、業務で実際によく見かけるアノテーションをまとめるよ。この記事でまとめるアノテーションは、`@Data`、`@Value`, `@NoArgsConstructor`, `@AllArgsConstructor`, `@RequiredArgsConstructor`の5つだよ。

## `@RequiredArgsConstructor`
finalなフィールドを初期化するコンストラクタが生成されるよ。逆にfinalをつけないとインジェクションされないよ。
実際にコードを書くよ。`@RequiredArgsConstructor`を利用して作成したクラスは以下のようになるよ。
```java
@RequiredArgsConstructor
public class Student {
    private final Integer id;
    private final String name;
    private String club;
}
```
これは、以下のようなコードと同じになるよ。
```java
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つのアノテーションはよくセットで使われることがあるよ。
またまた、アノテーションを使ったクラスを作るよ。
```java
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private final Integer id;
    private final String name;
    private String club;
}
```
これは、以下のようなコードと同じになるよ。
```java
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](https://projectlombok.org/features/Data)によると、`@Value`は以下のアノテーションを付与したのと同じ状態になるようだよ。`@Value`を付与すれば、イミュータブルなオブジェクトを作成できるよ。
* `@Getter`
* `@ToString`
* `@EqualsAndHashCode`
* `@AllArgsConstructor`
* 全てのフィールドが`private`かつ`final`になる
* クラスは`final`になる

`@Value`を使ってクラスを作ってみると、こんな感じ。
```java
@Value
public class Student {
    Integer id;
    String name;
    String club;
}
```
`@Value`を使わないと以下のようなイメージ。
```java
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](https://projectlombok.org/features/Value)によると、`@Data`は以下のアノテーションを付与したのと同じ状態になるようだよ。
* `@Getter`
* `@Setter`
* `@ToString`
* `@EqualsAndHashCode`
* `@RequiredArgsConstructor`
おもに`getter`, `setter`を必要とするクラスに付与すると思っていたら良さそうだよ。
クラスを作成すると、こんな感じ。
```java
@Data
public class Student {
    private Integer id;
    private String name;
    private String club;
}
```
`@Data`を使わないと以下のようなイメージ。
```java
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`を同時に付与して不要なものを付けたりしないように注意しよう。