@Builder 是 lombok
中的注解。可以使用builder(
构造的Person.PersonBuilder
对象进行链式调用,给所有属性依次赋值。
Person person1 = Person.builder(
.name("张三"
.age(20
.build(;
System.out.println(person1; // Person(name=张三, age=20
System.out.println(Person.builder(; // Person.PersonBuilder(name=null, age=null
文档中给了案例,在实体类上添加 @Builder
后,实体类会被改造成如下的结构:
Before:
@Builder
class Example<T> {
private T foo;
private final String bar;
}
After:
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;
}
}
}
源码如下:
@Target({TYPE, METHOD, CONSTRUCTOR}
@Retention(SOURCE
public @interface Builder {
@Target(FIELD
@Retention(SOURCE
public @interface Default {}
String builderMethodName( default "builder";
String buildMethodName( default "build";
String builderClassName( default "";
boolean toBuilder( default false;
AccessLevel access( default lombok.AccessLevel.PUBLIC;
String setterPrefix( default "";
@Target({FIELD, PARAMETER}
@Retention(SOURCE
public @interface ObtainVia {
String field( default "";
String method( default "";
boolean isStatic( default false;
}
}
@Singular 注解修饰集合
该注解默认变量的名称是一个复数,并且尝试生成该变量的奇数形式。例如 List<String> skills
,会添加3个方法:
-
skills(List<String> skillList
添加一个集合 -
clearSkills(
清空集合,并且将未初始化的集合初始化未空集合。
skill(String skill
添加单个元素
@Singular("skill"
private List<String> skillList;
这时会生成skill(String skill
、 skillList(List<String> skillList
和 clearSkillList(
三个方法。
@Builder.Default
@Builder.Default 设置默认值,构建对象时可以不用调用`name(方法。(调用后会覆盖默认值)
@Builder.Default
private String name = "zhangsan";
@SuperBuilder
@Builder
注解无法解析父类的属性,而@SuperBuilder
可以读取父类的属性。使用时需要在子类和父类上都加上这个注解。@SuperBuilder public class Male extends Person{ } @SuperBuilder public class Person { @Builder.Default private String name = "zhangsan"; private Integer age; @Singular("skillList" private List<String> skillList; }
@SuperBuilder(toBuilder=true
使用
@SuperBuilder(toBuilder=true
可以使用已有的对象构建新的对象,旧对象的属性值会被保留和覆盖。注意: 子类和父类都需要加上toBuilder=true
Male man = Male.builder( .name("张三" .age(20 .build(; Male man2 = man.toBuilder( .age(30 .build(;