@SuperBuilderについて
最初に@Builderを理解する
この記事を読んだ場合は、この注釈を使用している必要があります。基本的な使用法について簡単に説明します。すでに知っている場合は、この部分をスキップできます。
依存関係の導入(Maven構造)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
クラスを作成する
/**
* @author lingxi
* @date 2021/2/2 19:09
*/
@SuperBuilder(toBuilder = true) //toBuilder属性默认关闭,如果开启,则所有的父类应该也要开启
@Getter
public class Child extends Parent{
}
@SuperBuilder(toBuilder = true)
@Getter
public class Parent {
private Integer age;
private String name;
}
ここで@Builderアノテーションを使用すると、新しいインスタンスを作成するときに次のように記述できます。
/**
* @SuperBuilder 测试
*/
@Test
public void superBuilderTest() {
// 子类继承父类,需要父类和子类都要添加注解@SuperBuilder
Child aaa = Child.builder().age(12).name("aaa").build();
System.out.println(aaa.getName());
// toBuilder属性默认关闭,如果开启,则所有的父类应该也要开启
// 这是一个类似深拷贝的一个方法,不会改变原有实例的属性,生成一个新的实例
Child nbbb = aaa.toBuilder().name("nbbb").build();
System.out.println(nbbb.getName());
}
ご覧のとおり、@ Builderアノテーションを記述するだけで、次の利点があります。
複数のパラメーターの場合、アノテーションがコンストラクターに置き換わり、クラスを構築するためのコードの量が削減さ
れます。Builderを介した構築方法、つまり属性名(値)の方法は、直接の方法よりも読みやすくなります。コンストラクターを使用し、頻繁よりも読みやすくなります。setメソッドの使用方法はより簡潔です。
2.2。@SuperBuilderを理解する
2.2.1。@SuperBuilderはどのような問題を解決しますか?
上記(2.1)では、@ Builderの使用法を理解し、例のMingクラスのメンバー属性を親クラスに配置します。
public class Person {
private Integer age;
private String name;
}
@Builder
public class Ming extends Person{
}
現時点では、以前の.builderの呼び出しでエラーが報告されます。これは、@ Builderが親クラスのメンバープロパティの構築をサポートしていないためです。@ SuperBuilderアノテーションの外観は、この問題を解決するために使用されます。
@SuperBuilder
public class Person {
private Integer age;
private String name;
}
@SuperBuilder
public class Ming extends Person{
}
このようにして、サブクラスは通常、ビルダー構築のために親クラスのメンバー属性を取得できます。
@SuperBuilder(toBuilder = true)使用法
toBuilderプロパティはデフォルトでオフになっています。オンになっている場合は、すべての親クラスもオンにする必要があります。効果は次のとおりです。
Ming mingD = Ming.builder()
.age(11)
.name("小明")
.build();
Ming mingF = mingD.toBuilder().name("猪").build();
System.err.println(mingD.toString());
System.err.println(mingF.toString());
trueに設定すると、すべてのクラスインスタンスにtoBuilderメソッドが含まれます。これはディープコピーに似たメソッドであり、元のインスタンスのプロパティを変更せず、新しいインスタンスを生成しません。toBuilderで値が割り当てられている属性は割り当てられた属性に変更され、割り当てられていない属性は呼び出し元のインスタンスの値の対象になります。
2.2.3。@SuperBuilder(buildMethodName =“ execute”、builderMethodName =“ helloWorld”、toBuilder = true)使用法
この使用法は実際には無意味です。メソッド名をカスタマイズするため、展開しません。
2.2.4。@ Builder.ObtainVia(XXX)の使用法
これは、Filedまたはパラメータの注釈です。ソースコードを見てみましょう。
@Target({
FIELD, PARAMETER})
@Retention(SOURCE)
public @interface ObtainVia {
/**
* @return Tells lombok to obtain a value with the expression {@code this.value}.
*/
String field() default "";
/**
* @return Tells lombok to obtain a value with the expression {@code this.method()}.
*/
String method() default "";
/**
* @return Tells lombok to obtain a value with the expression {@code SelfType.method(this)}; requires {@code method} to be set.
*/
boolean isStatic() default false;
}
その中で、
このフィールドは、値を割り当てるときに使用する属性をlombokに指示します。
メソッドは、割り当て時に呼び出すメソッドをlombokに指示します。IsStatic
はメソッドに従います。デフォルト値はfalseで、対応するメソッドが静的かどうかを示します。
これらのメソッドは使用可能な場合のみであることに注意してください。ToBuilderで。=有効な場合はtrue、混合しないことをお勧めします(順序の問題があります)
2.2.5。補足工法
2019-10-10アップデートに注意してください
@Builderまたは@SuperBuilderアノテーションを使用する場合、デフォルトではnullパラメーターコンストラクターは作成されません。追加のnullパラメーターコンストラクターまたはフルパラメーターコンストラクターが必要な場合は、サブクラスと親クラスの両方に次のアノテーションを追加する必要があります。
@AllArgsConstructor //全参构造函数
@NoArgsConstructor //空参构造函数