lombok 基础注解之 @Builder

最全的 lombok 注解详情(随着版本不定时更新)

一、注解介绍

@Builder 注解为类生成相对略微复杂的构建器 API

  • 它作用于类,将其变成建造者模式
  • 可以以链的形式调用
  • 初始化实例对象生成的对象是不可以变的,可以在创建对象的时候进行赋值
  • 如果需要在原来的基础上修改可以加 set 方法,final 字段可以不需要初始化
  • 它会生成一个全参的构造函数

二、属性介绍

  • @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 刘亦菲 {
    
    
	@Builder.Default
	private String name = "刘亦菲";
	
	private String sex;
	
	private final Integer age = 18;	// final 字段加不加 Default 都可以初始化成功
	
	public static void main(String[] args) {
    
    
		刘亦菲 yifei = 刘亦菲.builder().build();	// 如果没有加 Default,那么输出的 name 结果是 null。
		/**
		 * 类似于拷贝,修改了 name 值,age 值还是原来的
		 * 如果 toBuilder = false,则没有 toBuilder 方法
		 */
		yifei = yifei.toBuilder().name("刘亦菲").build();
	}
}
我们在平时开发中经常会用到泛型,而 @Builder 也支持指定泛型构建
@Builder
public class 刘亦菲<T> {
    
    
	public void yiyang(刘亦菲<T> yi) {
    
    
		yi = 刘亦菲.<T>builder().builder();
	}
}
@Builder 会生成一个全参构造方法,因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题,这个时候手写或者加上 @NoArgsConstructor 都会报错,两种解决方案
一、加上 @AllArgsConstructor
@Builder
@AllArgsConstructor
public class 刘亦菲 {
    
    
	public 刘亦菲() {
    
    
		/**
		 * 手写或者 @NoArgsConstructor 都会使 @Builder 生成的全参构造函数失效
		 * 这个时候就被报错,加上 @AllArgsConstructor 或者手写一个全参构造函数即可
		 */
	}
}
二、使用 @Tolerate 注解
@Builder
public class 刘亦菲 {
    
    
	@Tolerate
	public 刘亦菲() {
    
    
		/**
		 * 官方解释:使任何方法或者构造函数让 lombok 假装它不存在
		 */
	}
}

四、@Builder 内部做了什么

  • 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)
  • 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
  • 在构建器中:创建一个无参的 default 构造函数
  • 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
  • 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
  • 在构建器中:会生成一个 toString 方法
  • 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器
@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 + ")";
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39249094/article/details/120881578