@Builder 注解为类生成相对略微复杂的构建器 API
@Builder.Default:非 final 的字段可以有默认值
builderMethodName:指定创建内部静态类的方法名,默认值为 builder
buildMethodName:指定创建实体类的方法名,默认值为 build
builderClassName:指定内部静态的类名,默认值为 “”,默认创建的类名为 thisclassBuilder
toBuilder:设置为 true 可以对这个对象进行拷贝生成新的对象,可以再修改,默认为 false
access:设置 builderMethodName 的访问权限修饰符,默认为 public
共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE,其中 MODULE 是 Java 9 的新特性
setterPrefix:设置 setter 方法的前缀,默认为 “”
@Builder(
builderMethodName = "builder", buildMethodName = "build", builderClassName = "",
toBuilder = true, access = AccessLevel.PUBLIC, setterPrefix = ""
)
public class Yifei {
@Builder.Default
private String name = "刘亦菲";
private String sex;
private final Integer age = 18; // final 字段加不加 Default 都可以初始化成功
public static void main(String[] args) {
Yifei yifei = Yifei.builder().build(); // 如果没有加 Default,那么输出的 name 结果是 null。
/**
* 类似于拷贝,修改了 name 值,age 值还是原来的
* 如果 toBuilder = false,则没有 toBuilder 方法
*/
yifei = yifei.toBuilder().name("刘亦菲").build();
}
}
@Builder
public class Yifei<T> {
public void yiyang(Yifei<T> yi) {
yi = Yifei.<T>builder().builder();
}
}
@Builder
@AllArgsConstructor
public class Yifei {
public Yifei() {
/**
* 手写或者 @NoArgsConstructor 都会使 @Builder 生成的全参构造函数失效
* 这个时候就被报错,加上 @AllArgsConstructor 或者手写一个全参构造函数即可
*/
}
}
lombok 基础注解之 @Builder.ObtainVia
@Builder
public class User {
private String username;
private String password;
}
public class User {
private String username;
private String password;
User(String username, String password) {
this.username = username;
this.password = password;
}
public static User.UserBuilder builder() {
return new User.UserBuilder();
}
public static class UserBuilder {
private String username;
private String password;
UserBuilder() {}
public User.UserBuilder username(String username) {
this.username = username;
return this;
}
public User.UserBuilder password(String password) {
this.password = password;
return this;
}
public User build() {
return new User(this.username, this.password);
}
public String toString() {
return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";
}
}
}