Status Code 303 - See Other

サーバサイド、iOS・アンドロイドアプリ、インフラレベルの話まで幅広くやってます。情報の誤りや指摘・意見などは自由にどうぞ。

Lombok ライブラリ - クラス関連

主記事
Lombok ライブラリ - Status Code 303 - See Other

この記事では、クラスに定義可能なアノテーションを記述。
(記事執筆時のバージョン :v1.16.6)

クラス性質

ある性質を有するクラス構造を提供する。

@Data

全てのフィールドに対するゲッタ、全ての transient ではないフィールドを利用した便利な toString, equals, hashCodeメソッドを提供する。
また、全ての final ではないフィールドに対するセッタと必要パラメータ用コンストラクタを提供する。

オプション

staticConstructor
生成インスタンスを指定した名前のstaticメソッドでのみ提供できる。

import lombok.Data;
import lombok.NonNull;

@Data(staticConstructor="of")
public class Book {

	private final String id; // final なので引数に追加される
	@NonNull
	private String title;    // @NonNull なので引数に追加される
	private String author;
	private int page;

	public static void main(String[] args) {
		// 使用方法
		Book b = Book.of("ID", "Title");
	}
}

注釈

コンストラクタアノテーションを一緒に記述すると public なコンストラクタが優先して提供され、static メソッドが提供されなかった。

@Value

不変クラスの表現に合致したコードを生成する。具体的には、下記がクラスに設定される。

オプション

staticConstructor
(@Data参照)

注釈

フィールド宣言に final がなくても、Lombok による自動生成コード上では
final が付与されるため以下のコードは、コンパイルエラーとなる。

import lombok.Value;

@Value
public class Book {

	private String id; // 宣言は final ついていない
	private String title;
	private String author;
	private int page;

	public static void main(String[] args) {
		Book b = new Book("ID", "Title", "Author", 5);
		b.author = "AAA"; //コンパイルエラー finalなので変更できない
	}
}

また、不変クラスとして扱うとあるが、フィールドに可変インスタンスが存在していた場合、
ゲッタはその参照を返してしまうので、そのフィールドの内部は変更されることに注意する。

@Builder

「指定したクラス」もしくは「指定されたメンバーメソッドを含むクラス」に対して、
いわゆる Builder パターン機能を付加する。

指定可能な要素

なお、既にクラスに private な全フィールドのパラメータを持つコンストラクタが存在しても、上記が作成される。

指定クラスの影響

private コンストラクタをメンバーに持つ「(指定クラス名)Builder」という
インナークラス(以後 Builder クラス)が生成される。
Builder クラスのインスタンス(以後 Builder インスタンス)を生成するメソッドとして、
static の builder メソッドが生成される。

なお、Builderクラスのインスタンスメソッドに似たものがあるが、
こちらは「 build 」メソッド( er がない)で全くの別もの。(詳細は下記)

Builder クラスの構成

なお、上記 builder メソッドの返す型は、static メソッドに指定されていなければ、指定クラスの型が返る。

詳細な説明はこちら。(@Builder)
例:

@Builder
class Example {
	private int foo;
	private final String bar;
}

このように設定したクラスは Lombok によって次のように変換される。

class Example<T> {
	private T foo;
	private final String bar;

	private Example(T foo, String bar) {
        	this.foo = foo;
		this.bar = bar;
	}
	public static <T> ExampleBuilder<T> builder() {
		return new ExampleBuilder<T>();
	}

	public static class ExampleBuilder<T> {
		private T foo;
		private String bar;

		private ExampleBuilder() {}
		public ExampleBuilder foo(T foo) {
			this.foo = foo;
			return this;
		}
		public ExampleBuilder bar(String bar) {
			this.bar = bar;
			return this;
		}
		@java.lang.Override public String toString() {
			return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
		}
		public Example build() {
			return new Example(foo, bar);
		}
	}
}
オプション

builderClassName(デフォルト:builder)
ビルダークラス名を変更する。デフォルトでは、@Builder 指定クラスとコンストラクタから「(指定クラス)Builder」という名前になる。
builderMethodName
Builder インスタンスを作成する static のメソッド名を変更する。
buildMethodName(デフォルト:build)
@Builder が指定されたクラスのインスタンスを作成する Builder クラスのメソッド名を変更する。
toBuilder(デフォルト:false)
@Builder が指定されたクラスのフィールドに Builder インスタンスの初期化に関わるデータがあり、そのデータから Builder インスタンスを生成するインスタンスメソッドを生成する必要がある場合は true を指定する。 なお、このオプションが指定可能なのは、

の場合である。

コンストラクタ自動生成

コンストラクタを自動生成するアノテーションについて記述する。

@AllArgsConstructor

全てのフィールドに対する初期化データを必要とするコンストラクタを提供する。

オプション

access(デフォルト: public)
コンストラクタのアクセスレベルを設定できる。
onConstructor
Lombokにより生成されたコンストラクタに設定するアノテーションのリストを記述する。
staticName
生成インスタンスを指定した名前のstaticメソッドでのみ提供可能にする。型パラメータをクラスに渡すときに便利らしい。

@RequiredArgsConstructor

初期化が必要なフィールドに対する引数データを持ったコンストラクタの提供。
初期化が必要なフィールドとは、finalもしくは@NonNullが付属したフィールドを指す。

オプション

access, onConstructor, staticName
@AllArgsConstructorと同等。

@NoArgsConstructor

引数のないコンストラクタを提供する。もし、このアノテーションを指定しているにも関わらず
クラス定義に final フィールドが存在し、かつ、オプション forceが true でない場合、コンパイルエラーとなる。
(@NonNullは無視されるため、記述されていても問題ない)

オプション

access, onConstructor, staticName
@AllArgsConstructorと同等。
force(デフォルト:false)
trueなら、全てのfinalフィールドを 0 / null/ falseに初期化する。

ユーティリティメソッド自動生成

特定のメソッドを提供するアノテーションについて記述する。

@ToString

関連フィールドから構成される、継承クラスによって構成される toString メソッドを実装する。
詳細ドキュメント(@ToString)。

オプション

callSuper(デフォルト:false)
生成された toString メソッドに、スーパークラスメソッド出力を含める場合。
doNotUseGetters(デフォルト:false)
生成された toString メソッドにフィールドを直接参照させる場合。 デフォルトでは、ゲッタが利用可能であれば、それを通じてアクセスする。
exclude
生成される toString メソッドの出力に特定フィールドを除外したい場合。of とは一緒に記述できない。
includeFiledNames(デフォルト:true)
生成される toString メソッドの出力にフィールド名を含める場合。
of
生成される toString メソッドの出力に含めるフィールドを明示的に設定したい場合。exclude とは一緒に記述できない。

@EqualsAndHashCode

関連フィールドに基づいた、全ての継承クラスに対する equals と hashCode メソッドを生成する。

オプション

callSuper(デフォルト:false)
このクラスのメソッドを実行する前に、スーパークラスのequals/hashCodeメソッドを呼び出す。
doNotUseGetters(デフォルト:false)
生成メソッドにフィールドを直接参照させる場合には true を設定する。 デフォルトでは、ゲッタが利用可能であればそれを通じてアクセスする。
exclude
生成される equals/hashCodeメソッドの同値条件から除外したいフィールドを指定する。of とは一緒に記述できない。
onParam
生成される equals/hashCodeメソッドアノテーションを設定したい場合指定する。
of
生成された equals/hashCodeメソッドの同値条件に含めるフィールドを明示的に指定する。 デフォルトでは、全てのstatic, transient でないフィールドが使われ、exclude とは一緒に記述できない。

アクセッサ自動生成

@Getter

クラス内の @Getter が既に設定されていない static でないフィールドに対して、ゲッタを提供する。
詳細は、フィールド関連 - @Getterを参照。

オプション

フィールドと異なる点として onMethod は使えない。

lazy
フィールド関連 - @Getterを参照
value
フィールド関連 - @Getterを参照

@Setter

クラス内の static でなく @Getter も設定されていないフィールドに対してセッタを提供する。

オプション

フィールドと異なる点として onMethod は使えない。

lazy
フィールド関連 - @Setterを参照
value
フィールド関連 - @Setterを参照

ツールに対する適用外設定

@Generated

全てのメソッドに@Generatedを適用する。詳細は、その他 - @Generatedを参照。