Lombok　①導入編

# Lombok とは

Javaクラスを作成する際の冗長的な記述をコンパイル時に自動で生成してくれるライブラリです。

例えば以下のクラスが

```java:DateTime.java
public class DateTime
{
    private LocalDateTime value = LocalDateTime.MIN;

    public DateTime()
    {
    }

    public DateTime( LocalDateTime value )
    {
        this.value = value;
    }

    public boolean isEmpty()
    {
        return value == null;
    }

    public boolean isNotEmpty()
    {
        return !isEmpty();
    }
    
    public String format( String pattern )
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern( pattern);
        return formatter.format( value );
    }
    
    public LocalDateTime getValue()
    {
        return value;
    }

    public void setValue( LocalDateTime value )
    {
        this.value = value;
    }

    @Override
    public String toString()
    {
        String format = "Person(name=%s)";
        return String.format(format, value);
    }

}
```

以下のようにリファクタリング可能です。

```java:DateTime.java
@AllArgsConstructor
@NoArgsConstructor
@toString
public class DateTime
{
    @Getter
    @Setter
    private LocalDateTime value = LocalDateTime.MIN;

    public boolean isEmpty()
    {
        return value == null;
    }

    public boolean isNotEmpty()
    {
        return !isEmpty();
    }    
    
    public String format( String pattern )
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern( pattern);
        return formatter.format( value );
    }
}
```

さらに

```java:DateTime.java
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DateTime
{
    private LocalDateTime value = LocalDateTime.MIN;

    public boolean isEmpty()
    {
        return value == null;
    }

    public boolean isNotEmpty()
    {
        return !isEmpty();
    }    
    
    public String format( String pattern )
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern( pattern);
        return formatter.format( value );
    }}
```

まで省略可能です。
`※@Dataは@Getterや@Setter等の複数アノテーションの複合を意味する`

クラス内が意味のあるメソッドのみになるのでスッキリです。


他にも色々アノテーションがありますが、

- `@AllArgsConstructor`
- `@NoArgsConstructor`
- `@Getter`
- `@Setter`
- `@toString`

入門レベルであれば上記あたりを押さえておけば、とりあえずは大丈夫だと思います。

# 導入

## 開発環境

- Eclipse
- Gradle

## 1-a. providedスコープで依存性追加(gradle2.11以下の場合のみ)

lombokはコンパイル時にアノテーションに従って各メソッドを生成するが、
gradle2.11以下だと自前でprovidedConfigurationsを追加する必要がある。

```groovy:build.gradle
...
configurations {
    provided
}
...
dependencies {        
...
    provided "org.projectlombok:lombok:1.16.4"
...
}
```

また、Eclipseで開発する場合は以下の記述も必要になる。

```groovy:build.gradle
eclipse {
    classpath {
        plusConfigurations += [configurations.provided]
        noExportConfigurations += [configurations.provided]
    }
}
```

## 1-b. warプラグインで依存性追加(gradle2.1２以上の場合のみ)

1-aでは自前でprovidedConfigurationsを定義したが、gradleのwarプラグインを追加することで、providedCompileが利用可能になるので、それを使っても良い

```groovy:build.gradle
...
apply plugin: 'war'
...
dependencies {        
...
    providedCompile "org.projectlombok:lombok:1.16.4"
...
}
```

## 1-c. compileOnlyで依存性追加(gradle2.11以下の場合のみ)

gradle2.12からはデフォルトでprovidedにあたるcompileOnlyというスコープが追加されたのでそれを利用する。

```groovy:build.gradle
...

dependencies {        
...
    compileOnly "org.projectlombok:lombok:1.16.4"
...
}
```

## ２. Eclipseにlombokプラグインの追加

依存性を追加しただけでは、ビルドしたアプリは問題なく動くがIDE上では認識されないのでlombokプラグインを追加する必要がある。
<img width="896" alt="スクリーンショット 2017-03-25 20.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/744870ee-ae03-9487-5ed8-d73ffc1bb8d7.png">


公式サイトからjarをダウンロード
https://projectlombok.org/download.html

Windowsの場合
ダウンロードしたjarをダブルクリックすることでインストーラーが起動するのでEclipseのexeファイルを選択することで設定完了となります。

Macの場合
ダウンロードしたJarを以下のディレクトリにコピー
```bash
cp ./lombok.jar /Applications/Eclipse.app/Contents/MacOS/lombok.jar
```

/Applications/Eclipse.app/Contents/Eclipse/eclipse.iniに以下を追記

```ini:eclipse.ini
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar
```

これでEclipse上でLombokのアノテーションが有効化されます。

<img width="930" alt="スクリーンショット 2017-03-25 20.27.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/2c0466a3-2231-9523-c3b2-a11b607d95cd.png">

これで無駄なコーディング時間を抑える事が可能になりました。

ただ、オブジェクトによってはSetterを作らない方が良いケースもあるのでうまく使い分けて快適なJavaライフを過ごしましょう♪

※Kotlinを使えばlombokを導入する事なく同様の事ができますがそれはまた別のお話。。。

# 次回

次はオブジェクトの生成に関するアノテーションを紹介したいと思います。

じゃあの。