LoginSignup
4

More than 3 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 以降では標準実装されたため使わなそう

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
What you can do with signing up
4