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使用总结内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot集成smart-doc自动生成接口文档详解

    spring boot集成smart-doc自动生成接口文档详解

    这篇文章主要介绍了spring boot集成smart-doc自动生成接口文档详解,smart-doc是一款同时支持java restful api和Apache Dubbo rpc接口文档生成的工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法
    2022-09-09
  • java实现直线分形山脉

    java实现直线分形山脉

    这篇文章主要为大家详细介绍了java实现直线分形山脉,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • springMVC @RestControllerAdvice注解使用方式

    springMVC @RestControllerAdvice注解使用方式

    这篇文章主要介绍了springMVC @RestControllerAdvice注解使用方式,下面通过一个简单的示例,演示如何使用 @RestControllerAdvice,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 深入详解Java泛型擦除原理与限制

    深入详解Java泛型擦除原理与限制

    这篇文章主要介绍了深入详解Java泛型擦除原理与限制,Java泛型的设计有个独特之处,类型信息只存在于编译期,运行时会被彻底擦除,这种 擦除机制让很多开发者困惑,下面我们来探索它,需要的朋友可以参考下
    2026-01-01
  • Spring Security将用户数据存储到数据库的方法

    Spring Security将用户数据存储到数据库的方法

    这篇文章主要介绍了Spring Security将用户数据存储到数据库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现AOP代理的三种方式详解

    Java实现AOP代理的三种方式详解

    AOP是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善。本文将用Java实现AOP代理的三种方式,需要的可以参考一下
    2022-07-07
  • SpringBoot详细分析自动装配原理并实现starter

    SpringBoot详细分析自动装配原理并实现starter

    相对于传统意义上的Spring项目,SpringBoot具有开箱即用,简化配置,内置Tomcat等等等等一系列的特点。在这些特点中,最重要的两条就是约定优于配置和自动装配
    2022-07-07
  • springboot框架的全局异常处理方案详解

    springboot框架的全局异常处理方案详解

    这篇文章主要介绍了springboot框架的全局异常处理方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 使用Java实现对两个秒级时间戳相加

    使用Java实现对两个秒级时间戳相加

    在现代应用程序开发中,时间戳的处理是一个常见需求,特别是当我们需要对时间戳进行运算时,比如时间戳的相加操作,本文我们将探讨如何使用Java对两个秒级时间戳进行相加,并展示详细的代码示例和运行结果,需要的朋友可以参考下
    2024-08-08
  • Java 超详细讲解Spring MVC异常处理机制

    Java 超详细讲解Spring MVC异常处理机制

    Spring MVC中提供了一个通用的异常处理机制,它提供了一个成熟、简洁并且清晰的异常处理方案。当使用Spring MVC开发Web应用时,利用这套现成的机制进行异常处理也更加自然并且高效
    2022-04-04

最新评论