いまさらLombokの使い方

#はじめに
あるプロジェクトのソースをインポートすると、ビルドエラーがいっぱいありました。
XXXBuilderが存在しないようなエラーがいっぱいあります。
build.gradleを見るとlombokのライブリを使ってますが、実はIDEにもLombokのプラグインインストールする必要があります。

#Lombok
https://projectlombok.org/

>Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

#Spring Tool Suite
##lombokダウンロード
https://projectlombok.org/download

##lombok JARにダブルクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/e154aa0d-af34-de05-3dcf-777f877c70e3.png)

##Specify location をクリックして、STSのフォルダー選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/6594726a-70aa-add1-1382-834666601451.png)

##Selectボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/271e2737-46c0-4e05-4ddd-cf8ea37af0cc.png)

##Install / update をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/208e8f77-3286-4722-73c9-f3a0b6e79d73.png)

インストール完了。

#Idea
##File　⇒　Settings ⇒ Plugins ⇒ lombok入力して検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/2ac6c9bb-0c66-3e31-774c-7c976ec8ed64.png)

Installedにすでに存在する場合はインストールする必要がありません。

##MarketPlaceタブに選択して、lombok入力して検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/14d88a61-eebc-1e4b-08a1-024ad0804d8b.png)

##Installボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/915fa7e5-4eb7-4efd-d9f1-b8915da2c2dd.png)

Restart IDEボタンを押して完了。

#VSCode
Lombok Annotations Support for VS Codeという拡張を使ってビルドエラー回避できます。
https://marketplace.visualstudio.com/items?itemName=GabrielBB.vscode-lombok

##「Lombok Annotations Support for VS Code」をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/08c939b2-e1d0-ea20-a37d-60b23f298fb2.png)

##Installボタンを押す
インストールした後、念の為VSCodeを再起動

#Lombokの使い方
##Lombok features
https://projectlombok.org/features/all

##build.gradleにlombokライブラリ追加
```build.gradle
    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    compile group: 'org.projectlombok', name: 'lombok', version: '1.18.12'
```

##`@Getter`/`@Setter`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/85c320f7-6d1e-6599-413b-6c86776efdc5.png)

わかりやすいですが、getter,setterメソッドを自動生成します。

##`@ToString`
toStringメソッドは、`@ToString(exclude = "age", callSuper = false)`のように定義して制御
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/0a9bd49a-4814-292c-65b5-1858c0413dd5.png)

除外されたageフィールドのみ未使用となっています。

##`@EqualsAndHashCode`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/87196a07-979c-790e-1171-c48f2667045f.png)

hashCode,equals,canEqual３つのメソッドが生成します。

##`@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5efc0df4-8ac5-e3fd-93b9-bf0781eac044.png)

##`@Value`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/4347becd-6a5d-2168-9e90-68c0c5ffb083.png)

##`@Builder`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/849e014a-31a7-ccff-c3a2-eb1a59101236.png)

##`@Data`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/65f852f9-3da7-ae0f-52e1-f2d8b00a1307.png)

上記の例の通り、下記らのアノテーションのまとめです。

- `@ToString`
- `@EqualsAndHashCode`
- すべての非finalフィールドの`@Getter`
- すべての非finalフィールドの`@Setter`
- `@RequiredArgsConstructor`

##`@Log`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/410ccee8-f7ff-7774-328a-bdf388321fea.png)

##`@Cleanup`
リソースを自動解放されるアノテーションです。自分でリソースのclose処理を省略できるので便利です。

```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import lombok.Cleanup;

public class TestMain {

	public static void main(String[] args) throws Exception {
		@Cleanup
		InputStream in = new FileInputStream(args[0]);
		@Cleanup
		OutputStream out = new FileOutputStream(args[1]);

		byte[] b = new byte[1024];
		while (true) {
			int r = in.read(b);
			if (r == -1) {
				break;
			}
			out.write(b, 0, r);
		}
	}

}
```

はかも`val`, `var`, `@NonNull`,`@Getter(lazy=true)`,`@Helper`, `@Slf4j`などなどがあります。

これらのアノテーションを使うとBeanクラスの量は削減できて、メンテナンスにも良くなります。

以上