lombok工具类中@Builder注解的使用

一.概述

@Builder注解是lombok工具类为我们提供的一个注解,加上此注解,我们就可以通过链式构造创建对象。

二、属性介绍

@Builder.Default:加在属性上,非 final 的字段可以有默认值

builderMethodName:指定创建内部静态类的方法名,默认值为 builder

buildMethodName:指定静态类中创建实体类的方法名,默认值为 build

builderClassName:指定内部静态的类名,默认创建的类名为 外部类的类名+Builder

toBuilder:设置为 true 则可以根据这个类生成静态内部类Builder对象,然后可以根据这个builder对象来修改此类。默认为 false

access:设置 builderMethodName 的访问权限修饰符,默认为 public
 

三.分析

我们可以随意创建一个类,加上@Builder注解,再通过查看其编译后的.class文件来看其原理。

以下是代码:

import lombok.Builder;

@Builder
public class Car {
    //发动机
    private String engine;
    //轮胎
    private String tyre;
}

.class文件


public class Car {
    private String engine;
    private String tyre;

    Car(final String engine, final String tyre) {
        this.engine = engine;
        this.tyre = tyre;
    }

    public static Car.CarBuilder builder() {
        return new Car.CarBuilder();
    }

    public static class CarBuilder {
        private String engine;
        private String tyre;

        CarBuilder() {
        }

        public Car.CarBuilder engine(final String engine) {
            this.engine = engine;
            return this;
        }

        public Car.CarBuilder tyre(final String tyre) {
            this.tyre = tyre;
            return this;
        }

        public Car build() {
            return new Car(this.engine, this.tyre);
        }

        public String toString() {
            return "Car.CarBuilder(engine=" + this.engine + ", tyre=" + this.tyre + ")";
        }
    }
}

通过查看其.class文件,我们发现其为这个类添加了有参构造器,一个静态内部类和一个获取静态内部类对象的方法。

其实其使用了建造者模式。即在此类中加上了Builder静态内部类,我们可以通过Builder内部类来分步骤创建外部类的部件,最后再通过build()方法来进行组装。

关于建造者模式,可以查看这一篇文章。

https://mp.csdn.net/mp_blog/creation/editor/131182663

但是,其没有创建无参构造,如果想要创建无参构造器,仅仅加上@NoArgsConstructor注解或者自定义无参构造器是不行的,编译时会报错,可以加上@AllArgsConstructor, @NoArgsConstructor,这两个注解来生成无参构造器。

四.使用方式

1.在类上加上@Builder注解

2.当需要创建对象时,先通过builder()方法获取其Builder内部类,再调用内部类中的各个方法进行赋值,最后调用build()方法,将刚才的值赋给外部类,从而创建所需要的对象。

也可以直接调用其构造器进行创建对象。

class MAIN{
    public static void main(String[] args) {
        Car car = Car.builder()
                .engine("自研发动机")
                .tyre("固特异")
                .build();
        System.out.println(car);
    }
}

总结

使用此注解,可以使用链式构造来创建对象。在参数很多时可以很清楚的明白每个参数是什么意思,也使创建的过程更加清晰。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值