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"); } }
@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 クラスの構成
- 指定クラスのコンストラクタ / static メソッドの各パラメータに相当するフィールドを持つ。
- インスタンスメソッドに生成フィールド名と同じものが生成され、それらはパラメータを自身に格納した後インスタンス自身を返す。
- 上記メソッドから得たパラメータを指定クラスの private コンストラクタ / static メソッドに渡し、完全に初期化された指定クラスのインスタンスを返す。
なお、上記 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
全てのフィールドに対する初期化データを必要とするコンストラクタを提供する。
ユーティリティメソッド自動生成
@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を参照