Java的Lombok之@Builder使用总结

 更新时间:2023年12月15日 10:06:18   作者:爱喝咖啡的程序员  
这篇文章主要介绍了Java的Lombok之@Builder使用总结,当不使用@Builder注解到类上,创建T1的有参构造函数,入参不仅包括T1中所有的参数,还包括T中所有的参数,T2的属性由T1在有参构造函数中通过调用父类构造器的方式赋初值,需要的朋友可以参考下

@Builder使用总结

一. @Builder与继承共存

我所使用的Lombok版本是1.18.8

截止1.18.8版本,使用了@Builder注解的类仍然无法使用继承,

public class Test {
    public static void main(String[] args) {
        T1.builder().build();
    }
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
class T1 extends T2{
    private String name;
    private Integer age;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
class T2{
    protected String pp;
}
 

报错:

Error:(19, 1) java: com.mmr.learn.T1中的builder()无法覆盖com.mmr.learn.T2中的builder()
返回类型com.mmr.learn.T1.T1Builder与com.mmr.learn.T2.T2Builder不兼容

解决方案:

不使用@Builder注解到类上,创建T1的有参构造函数,入参不仅包括T1中所有的参数,还包括T中所有的参数。

T2的属性由T1在有参构造函数中通过调用父类构造器的方式赋初值。

public class Test {
    public static void main(String[] args) {
        T1 t1 = T1.builder().name("java").pp("world").build();
        System.out.println(t1.getName());
        System.out.println(t1.getAge());
        System.out.println(t1.getPp());
    }
}
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
class T1 extends T2{
    private String name;
    private Integer age;
    @Builder(toBuilder = true)
    public T1(String pp, String name, Integer age) {
        super(pp);
        this.name = name;
        this.age = age;
    }
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
class T2{
    protected String pp;
}

二. @Builder与属性赋初值

就拿上面的案例来看,如果想对age赋初值,网上有的人将@Builder.Default 注解添加到待赋值属性上,如下图所示:

@Builder.Default
private Integer age = 26;

不涉及继承的场景中,这样用没有问题,因为@Builder.Default会为age在编译期间单独生成一个$default$age的方法,不仅在T1类内所有由Lombok自动生成的构造函数(比如使用@AllArgsConstructor或@NoArgsConstructor或@RequiredArgsConstructor等)中为age赋予了初值,而且还在T2Builder中也为其赋予了初值。因此,以下两种方式都能得到正确的结果:

System.out.println(T2.builder().build().getPp());
System.out.println(new T2().getPp());

但一旦涉及到继承,此方法就不能使用了。从场景1(@Builder与继承共存)中,我们知道了想要兼容继承关系,@Builder不能加到类上,但实际上,@Builder.Default必须使用在一个被@Builder标识的类中,因此@Builder.Default注解用不了了。

那该怎么办呢?很简单,我们在T1的有参构造函数中赋初值即可。

public class Test {
    public static void main(String[] args) {
        //输出: 25
        System.out.println(T1.builder().build().getAge());
        //输出: 26
        System.out.println(new T1().getAge());
    }
}
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
class T1 extends T2{
    private String name;
    private Integer age = 26;
    @Builder(toBuilder = true)
    public T1(String pp, String name, Integer age) {
        super(pp);
        this.name = name;
        if(null == age){
            this.age = 25;
        }else{
            this.age = age;
        }
    }
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
class T2{
    protected String pp;
}

到此这篇关于Java的Lombok之@Builder使用总结的文章就介绍到这了,更多相关@Builder使用总结内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ByteArrayOutputStream与InputStream互相转换方式

    ByteArrayOutputStream与InputStream互相转换方式

    这篇文章主要介绍了ByteArrayOutputStream与InputStream互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring AOP实现权限检查的功能

    Spring AOP实现权限检查的功能

    这篇文章主要介绍了Spring AOP实现权限检查的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • spring中向一个单例bean中注入非单例bean的方法详解

    spring中向一个单例bean中注入非单例bean的方法详解

    Spring是先将Bean对象实例化之后,再设置对象属性,所以会先调用他的无参构造函数实例化,每个对象存在一个map中,当遇到依赖,就去map中调用对应的单例对象,这篇文章主要给大家介绍了关于spring中向一个单例bean中注入非单例bean的相关资料,需要的朋友可以参考下
    2021-07-07
  • 解析Java和IDEA中的文件打包问题

    解析Java和IDEA中的文件打包问题

    这篇文章主要介绍了Java和IDEA中的文件打包问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • java 打印一字符串,并在main()方法内调用它

    java 打印一字符串,并在main()方法内调用它

    编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。
    2017-02-02
  • 深入C++ typedef的用法总结(必看)

    深入C++ typedef的用法总结(必看)

    本篇文章是对C++中typedef的用法进行了详细的总结分析,需要的朋友参考下
    2013-05-05
  • Java编程构造方法与对象的创建详解

    Java编程构造方法与对象的创建详解

    这篇文章主要介绍了Java编程构造方法与对象的创建详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • JAVA后端学习精华之网络通信项目进阶

    JAVA后端学习精华之网络通信项目进阶

    不同项目之间的通信方式分为,http、socket、webservice;其中socket通信的效率最高,youtube就采用的是原始的socket通信,他们信奉的原则是简单有效
    2021-09-09
  • Java实现获取行政区划的示例代码

    Java实现获取行政区划的示例代码

    这篇文章主要为大家详细介绍了如何利用Java语言实现获取行政区划的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习游戏
    2023-03-03
  • Springmvc restful配置遇到的小坑

    Springmvc restful配置遇到的小坑

    本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07

最新评论