lombok @RequiredArgsConstructor注解解析

关于lombok,常用的方法已经烂大街了,今天挖掘点不一样的。在项目中,当我们某个类的属性过多时,如果使用构造方法创建对象那将是一件很恐怖的事情,我甚至不知道每个参数对应的是什么意思,因此最常规的解决手段是按需添加一个初始化对象的静态方法,由于不是所有的属性都需要自定义,因此,这个方法就比较人性化,也让代码更加易于理解和使用:

class Car{
    private String origin = "德国";
    private String model;
    
    private Car(String model){
        this.model = model;
    }
    
    public static Car of(String model){
        return new Car(model);
    }
}

或者我们也可以使用builder模式来做:

class Car{
    private String origin;
    private String model;

    private Car(String model){
        this.model = model;
    }

    private Car(Builder builder){
        this.origin = builder.origin;
        this.model = builder.model;
    }

    public static Car of(String model){
        return new Car(model);
    }

    public static Builder builder(){
        return new Builder();
    }

    public static class Builder{
        private String origin;
        private String model;

        public Builder origin(String origin){
            this.origin = origin;
            return this;
        }

        public Builder model(String model){
            this.model = model;
            return this;
        }

        public Car build(){
            return new Car(this);
        }
    }
}

如果每个类都要这么写,那不是要把人累死,所以,就有了轮子来帮我们完成这些枯燥的操作,相信使用过lombok的小伙伴肯定不少,不过可能大多数小伙伴用的最多的一定是@Data@Getter这些用来代替getter和setter方法的注解,所以今天我们就利用lombok来让我们上面的代码简化。

对象初始化的静态方法:

@Data
@RequiredArgsConstructor(staticName = "of")
class Car{
    @NonNull
    private String origin;
    @NonNull
    private String model;
}

源码剖析(查看生成的class文件反编译的java代码):

class Car{
    @NonNull
    private String origin;
    @NonNull
    private String model;
    
    // 省略get、set方法
    private Car(@NonNull String origin, @NonNull String model) {
        if (origin == null) {
            throw new NullPointerException("origin is marked @NonNull but is null");
        } else {
            this.origin = origin;
        }
        if (model == null) {
            throw new NullPointerException("model is marked @NonNull but is null");
        } else {
            this.model = model;
        }
    }
    public static Car of(@NonNull String origin, @NonNull String model) {
        return new Car(origin, model);
    }
}

通过对源码的查阅之后发现,@RequiredArgsConstructor注解实际上做了两件事:1、添加了一个实例化对象的静态方法;2、添加了一个私有构造方法服务于该静态方法,在需要自定义的字段上面加入@NonNull后,这些字段就会按照属性在类中声明的先后顺序作为该方法的形参,同时会对这些字段做非空验证,如果为空就会报空指针异常,这是一个坑,需要注意。关于建造者模式,代码其实和我们上面手写的没有太大出入,所以这里就不做分析了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值