5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Lombokメモ

Posted at

Lombok とは

  • Java で getter / setter やコンストラクタ等のよく使うコードを自動生成してくれるライブラリ
  • 例えば、あるクラスに @Getter のアノテーションを付与すると、クラス内のフィールドの getter を自動生成してくれる
  • 公式ページはこちら

環境

  • openjdk 12.0.1
  • IntelliJ IDEA CE 2019.1
  • lombok 1.18.8

Lombok を使えるようにする

IntelliJ での設定

  • lombok プラグインをインストールする
    • Preference -> Plugins -> MarketPlace で lombok を検索してインストール
  • annotation processing を有効にする
    • Preferences -> Build, Execution, Deployment -> Compiler -> Annotation Processors で Enable annotation processing にチェックを入れる

build.gradle の設定

build.gradledependenciesに以下を追加する

build.gradle
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'

lombok で生成されたコードの確認

  • delombokを実行することで、lombok によって生成されたコードを確認できる
  • コマンドラインから確認する場合は以下
java -jar <lombok.jarのパス> delombok -p <アノテーションを付与したクラスのパス>

アノテーション

@Getter / @Setter

  • 付与したクラスに含まれるフィールドの getter / setter を自動生成する
付与する側
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
public class Human {
    private int age;
    private String name;
    private List<String> hobby;
}
生成されたクラス
import java.util.List;

public class Human {
    private int age;
    private String name;
    private List<String> hobby;

    @java.lang.SuppressWarnings("all")
    public int getAge() {
        return this.age;
    }

    @java.lang.SuppressWarnings("all")
    public String getName() {
        return this.name;
    }

    @java.lang.SuppressWarnings("all")
    public List<String> getHobby() {
        return this.hobby;
    }

    @java.lang.SuppressWarnings("all")
    public void setAge(final int age) {
        this.age = age;
    }

    @java.lang.SuppressWarnings("all")
    public void setName(final String name) {
        this.name = name;
    }

    @java.lang.SuppressWarnings("all")
    public void setHobby(final List<String> hobby) {
        this.hobby = hobby;
    }
}

@ToString

  • toString()メソッドを自動生成する
付与する側
import lombok.ToString;

import java.util.List;

@ToString
public class Human {
    private int age;
    private String name;
    private List<String> hobby;
}
生成されたクラス
import java.util.List;

public class Human {
    private int age;
    private String name;
    private List<String> hobby;

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    public java.lang.String toString() {
        return "Human(age=" + this.age + ", name=" + this.name + ", hobby=" + this.hobby + ")";
    }
}

@NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor

  • @NoArgsConstructor : 引数なしのコンストラクタを自動生成する
  • @RequiredArgsConstructor : final がついたフィールドを引数にとるコンストラクタを自動生成する
  • @AllArgsConstructor : 全てのフィールドを引数に持つコンストラクタを自動生成する
付与する側(@AllArgsConstructor)
import lombok.AllArgsConstructor;

import java.util.List;

@AllArgsConstructor
public class Human {
    private int age;
    private final String name;
    private List<String> hobby;
}
生成されたクラス
import java.util.List;

public class Human {
    private int age;
    private final String name;
    private List<String> hobby;

    @java.lang.SuppressWarnings("all")
    public Human(final int age, final String name, final List<String> hobby) {
        this.age = age;
        this.name = name;
        this.hobby = hobby;
    }
}

@Data

  • 以下のアノテーションを付与したのと同じ効果
    • @Getter / @Setter
    • @ToString
    • @EqualsAndHashCode
    • @RequiredArgsConstructor

@Value

  • @Dataの immutable 版
  • 全てのフィールドを private かつ final にする
  • setter は生成されない

@Builder

  • Builder クラスを自動生成する
付与する側
import lombok.Builder;

import java.util.List;

@Builder
public class Human {
    private int age;
    private final String name;
    private List<String> hobby;
}
使用する側
import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<String> hobby = Arrays.asList("フットサル", "ダイエット", "読書");
    Human human = new Human.HumanBuilder().age(20).name("名前太郎").hobby(hobby).build();
    System.out.println(human);
  }
}
生成されたクラス
import java.util.List;

public class Human {
    private int age;
    private final String name;
    private List<String> hobby;

    @java.lang.SuppressWarnings("all")
    Human(final int age, final String name, final List<String> hobby) {
        this.age = age;
        this.name = name;
        this.hobby = hobby;
    }


    @java.lang.SuppressWarnings("all")
    public static class HumanBuilder {
        @java.lang.SuppressWarnings("all")
        private int age;
        @java.lang.SuppressWarnings("all")
        private String name;
        @java.lang.SuppressWarnings("all")
        private List<String> hobby;

        @java.lang.SuppressWarnings("all")
        HumanBuilder() {
        }

        @java.lang.SuppressWarnings("all")
        public HumanBuilder age(final int age) {
            this.age = age;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public HumanBuilder name(final String name) {
            this.name = name;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public HumanBuilder hobby(final List<String> hobby) {
            this.hobby = hobby;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public Human build() {
            return new Human(age, name, hobby);
        }

        @java.lang.Override
        @java.lang.SuppressWarnings("all")
        public java.lang.String toString() {
            return "Human.HumanBuilder(age=" + this.age + ", name=" + this.name + ", hobby=" + this.hobby + ")";
        }
    }

    @java.lang.SuppressWarnings("all")
    public static HumanBuilder builder() {
        return new HumanBuilder();
    }
}

@NonNull

  • クラスのフィールドやメソッドの引数に付与すると 自動で null チェックしてくれる

@EqualsAndHashCode

  • equals(), hashCode()メソッドを自動生成する

@Log

  • logという名前で Logger を自動生成する
@Slf4jを付与した際に生成されるコード
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  • Slf4j , Log4j など様々なライブラリに対応している
  • Logger については別途勉強予定

var / val

  • 変数宣言時に自動で型を推論できる。JDK10 以降では標準実装されたため使わなそう
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?