@Builder 注解详情介绍

一、注解介绍
@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 的新特性

三、代码实例参考

@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 也支持指定泛型构建

@Builder
public class Yifei<T> {
	public void yiyang(Yifei<T> yi) {
		yi = Yifei.<T>builder().builder();
	}
}

@Builder 会生成一个全参构造方法,因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题,这个时候手写或者加上 @NoArgsConstructor 都会报错,两种解决方案
一、加上 @AllArgsConstructor

@Builder
@AllArgsConstructor
public class Yifei {
	public Yifei() {
		/**
		 * 手写或者 @NoArgsConstructor 都会使 @Builder 生成的全参构造函数失效
		 * 这个时候就被报错,加上 @AllArgsConstructor 或者手写一个全参构造函数即可
		 */
	}
}

二、使用 @Tolerate 注解

四、属性拓展
lombok 基础注解之 @Builder.ObtainVia

五、@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 + ")";
        }
    }
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值