Lombok中@Builder和@SuperBuilder注解的用法案例

目录
  • Lombok中@Builder和@SuperBuilder注解的用法
  • @Singular 注解修饰集合
  • @Builder.Default
  • @SuperBuilder
  • @SuperBuilder(toBuilder=true)
  • PS:java Lombok下解决@Builder继承解决方法(@SuperBuilder)

Lombok中@Builder和@SuperBuilder注解的用法

@Builder 是 lombok 中的注解。可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值。

 Person person1 = Person.builder()
            .name("张三")
            .age(20)
            .build();
    System.out.println(person1);                // Person(name=张三, age=20)
    System.out.println(Person.builder());       // Person.PersonBuilder(name=null, age=null)

文档中给了案例,在实体类上添加 @Builder 后,实体类会被改造成如下的结构:

Before:
  @Builder
  class Example<T> {
  	private T foo;
  	private final String bar;
  }

After:
  class Example<T> {
  	private T foo;
  	private final String bar;

  	// 私有的全参数构造函数
  	private Example(T foo, String bar) {
  		this.foo = foo;
  		this.bar = bar;
  	}

  	public static <T> ExampleBuilder<T> builder() {
  		return new ExampleBuilder<T>();
  	}

  	public static class ExampleBuilder<T> {
  		private T foo;
  		private String bar;

  		private ExampleBuilder() {}

  		public ExampleBuilder foo(T foo) {
  			this.foo = foo;
  			return this;
  		}

  		public ExampleBuilder bar(String bar) {
  			this.bar = bar;
  			return this;
  		}

  		@java.lang.Override public String toString() {
  			return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
  		}

  		public Example build() {
  			return new Example(foo, bar);
  		}
  	}
  }

源码如下:

@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {

	@Target(FIELD)
	@Retention(SOURCE)
	public @interface Default {}

	String builderMethodName() default "builder";

	String buildMethodName() default "build";

	String builderClassName() default "";

	boolean toBuilder() default false;

	AccessLevel access() default lombok.AccessLevel.PUBLIC;

	String setterPrefix() default "";

	@Target({FIELD, PARAMETER})
	@Retention(SOURCE)
	public @interface ObtainVia {

		String field() default "";

		String method() default "";

		boolean isStatic() default false;
	}
}

@Singular 注解修饰集合

该注解默认变量的名称是一个复数,并且尝试生成该变量的奇数形式。例如 List<String> skills,会添加3个方法:

  • skill(String skill) 添加单个元素
  • skills(List<String> skillList) 添加一个集合
  • clearSkills() 清空集合,并且将未初始化的集合初始化未空集合。

如果无法计算得到变量名称的奇数形式,则会提示报错信息。用户可以手动指定单数形式的方法名:

@Singular("skill")
    private List<String> skillList;

这时会生成skill(String skill) 、 skillList(List<String> skillList) 和 clearSkillList()三个方法。

@Builder.Default

使用 @Builder.Default 设置默认值,构建对象时可以不用调用name()方法。(调用后会覆盖默认值)

@Builder.Default
    private String name = "zhangsan";

@SuperBuilder

@Builder 注解无法解析父类的属性,而@SuperBuilder可以读取父类的属性。使用时需要在子类和父类上都加上这个注解

@SuperBuilder
public class Male extends Person{
}

@SuperBuilder
public class Person {
    @Builder.Default
    private String name = "zhangsan";

    private Integer age;

    @Singular("skillList")
    private List<String> skillList;
}

@SuperBuilder(toBuilder=true)

使用 @SuperBuilder(toBuilder=true) 可以使用已有的对象构建新的对象,旧对象的属性值会被保留和覆盖。注意: 子类和父类都需要加上toBuilder=true

  Male man = Male.builder()
                .name("张三")
                .age(20)
                .build();

        Male man2 = man.toBuilder()
                .age(30)
                .build();

PS:java Lombok下解决@Builder继承解决方法(@SuperBuilder)

由于Lombok @Builder不适用于继承用例:

class Foo{
 protected int xyz1;
 .....
 protected String xyz7;
}

class Bar extends Foo{

}

对于给定的用例,Lombok将无法生成方法来设置Foo类中定义的参数值。

解决方法是:

    • 手动创建Bar的构造函数。
    • 在该构造函数上放置一个Builder注释。

Lombok引入了实验性功能,其版​​本为:1.18.2,用于解决Builder注释所面临的继承问题,并且可以使用@SuperBuilder注释解决如下。

@SuperBuilder
public class ParentClass {
    private final String a;
    private final String b;
}

@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}

现在,可以使用如下所示的Builder类(使用@Builder注解是不可能的)

ChildClass.builder().a("testA").b("testB").c("testC").build();

到此这篇关于Lombok中@Builder和@SuperBuilder注解的用法的文章就介绍到这了,更多相关Lombok中@Builder和@SuperBuilder注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • Lombok基本注解之@SneakyThrows的作用

    使用范围: 只能作用在方法和构造函数之上 @SneakyThrows注解的作用得从java的异常设计体系说起. java中常见的异常有两种: Exception即非运行时异常(编译异常). RuntimeException即运行时异常. 第一种会强制要求抛出它的方法声明throws,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过.设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况.比如网络异常造成IOException. 但是现实,往往事与愿违.大部分情况下的异

  • 解决Lombok注解不起作用的问题

    Lombok注解不起作用 场景: 减少实体类中如Getter,Setter方法的书写 原因: lombok是一个第三方插件,我们使用时需要进行两个步骤(两个步骤缺一不可): 1:引入lombok依赖 2: 安装lombok插件 作用: Lombok是一个第三方插件,通过它我们可以直接书写注解来代替原来的getter,setter,toString等方法. 深入理解Lombok 说道Lombok,可能会鲜为人知.但是在实际的开发中,它起到了很大的作用,话不多说,直入正题: 一.Lombok是什么

  • Lombok 的@StandardException注解解析

    目录 1. 引言 2. 什么是 @StandardException? 2.1. 添加 Lombok 依赖 2.2. 使用类注解 3. 优点 4. 缺点 5. 结论 1. 引言 在 Java 应用程序中,异常类对于正确捕获和处理错误至关重要.我们常常在编写异常处理的重复代码上花费时间,而不是关注应用程序的其他方面. 在本教程中,我们将使用 Lombok 的 @StandardException 注解自动生成异常类型类的构造函数.此外,我们还将了解其优缺点. 2. 什么是 @StandardExc

  • Lombok注解之@SuperBuilder--解决无法builder父类属性问题

    目录 一.老规矩 二.判断是否为相同问题(@Builder注解不能 build 父类属性) 三.@SuperBuilder注解 1. 概念(需要注意您的Lombok版本) 2. 如何解决无法builder父类属性 3. 遇到的一个小坑(Lombok1.18.2) 四.总结 前言:Lombok的小坑之 @Builder注解不能 build 父类属性 正文在第三个目录下,学习@SuperBuilder注解的话可以直接根据目录跳到正文所在 一.老规矩 先上文档官方文档链接@SuperBuilder 二

  • Lombok的@Data等注解无效的解决

    一.已定义好的实体类 二.调用时没有get,set访问器 在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可~~~ 到此这篇关于Lombok的@Data等注解无效的解决的文章就介绍到这了,更多相关Lombok的@Data注解无效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 基于ssm中dao接口@Param注解的用法

    @Param 注解的用处:为了接口中方法的形参与xml文件中sql语句中的条件参数绑定 1.接口方法只有一个参数 完全没必要使用@Param注解 例: public interface PaperDao { Paper queryById(long id); } 此时相应的xml文件中,#{}中可以填写任意名称 <select id="queryById" parameterType="long" resultMap="resultMap1"

  • 聊聊Lombok中的@Builder注解使用教程

    目录 Lombok中的@Builder注解的使用 作用 引入依赖 第二步给实体类加上@Builder注解 第三步使用测试使用@Builder注解生成对象 实体类加上@Builder注解之后的编译结果 Lombok中的@Builder注解的使用 作用 @Builder注解的作用主要是用来生成对象,并且可以为对象链式赋值. 引入依赖 因为@Builder注解是lombok中的东西,所以第一步我们需要引入lombok的依赖,如下图: 第二步给实体类加上@Builder注解 第二步我们需要给我们的实体类

  • 详解Spring中@Valid和@Validated注解用法

    目录 案例引入 @Valid 详解 @Validated 详解 @Valid 和 @Validated 比较 案例引入 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 和 @Validated 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : /** * 员工对象 * * @author sunnyzyq * @since 2019/12/13 */ public class Employee { /** 姓名 */ public St

  • mysql中json类型字段的基本用法实例

    目录 前言 基本环境 JSON类型字段常用操作 插入JSON类型数据 查询JSON类型数据 更新JSON类型数据中的特定字段 匹配JSON类型数据中的特定字段 结语 前言 mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以对JSON类型字段中的特定的值进行查询和更新等操作,通过增加JSON类型的属性可以大大的提高我们在mysql表中存储的数据的拓展性,无需每次新增字段时都进行表结构的调整,下面我们不深入讲解底层的实现原理,我们主要来梳理一下我们在日常工作中使用实践 基本环境 my

  • 解决Lombok使用@Builder无法build父类属性的问题

    目录 Lombok使用@Builder无法build父类属性 问题描述 解决方案 使用示例 lombok @Builder注解和build父类属性问题 1.简介 2.使用 3.@Builder注解对类做了什么? 4.优缺点 5.问题:@Builder注解不能 build 父类属性 Lombok使用@Builder无法build父类属性 问题描述 实体类使用Lombok的@Builder来实现Builder模式,但是如果使用了extend继承,则子类无法通过Builder来Build父类属性值 解

  • Lombok中关于@Data的使用解析

    目录 Lombok @Data注解 内部实现 问题总结 解决方法 Lombok的@Data踩坑记录 证明 小结一下 当你在使用 Lombok 的 @Data 注解时,其实会有一些坑需要关注,今天就让我们来见识一下. Lombok 先来简单介绍一下 Lombok ,其官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple,

  • 关于@Entity和@Table注解的用法详解

    目录 @Entity和@Table注解的用法 @Entity注解 @Table注解 @Entity和@Table的区别 @Entity和@Table注解的用法 @Entity注解 @Entity注解和@Table注解都是Java Persistence API中定义的一种注解. @Entity说明这个class是实体类,并且使用默认的orm规则,即class名就是数据库表中表明,class字段名即表中字段名.@Entity注解指明这是一个实体Bean. import lombok.Data; 

  • IDEA中 Getter、Setter 注解不起作用的问题如何解决

    没有安装LOMBOK插件 解决:下载安装LOMBOK插件 依次点击File--->Settings....---->Plugins,进入界面,在搜索框中输入LOMBOK  此时将会看到下方提示,点击红色框内的字找到 LOMBOK, 下载安装 ,安装完重启IDEA即可. PS:idea中lombok注解GetterSetter等不生效的解决办法 原因:lombok版本问题 解决办法:Settings->Plugins 重新安装lombok,安装完重启IDEA 总结 到此这篇关于IDEA中

  • 详解SpringBoot启动类的扫描注解的用法及冲突原则

    背景 SpringBoot 启动类上,配置扫描包路径有三种方式,最近看到一个应用上三种注解都用上了,代码如下: @SpringBootApplication(scanBasePackages ={"a","b"}) @ComponentScan(basePackages = {"a","b","c"}) @MapperScan({"XXX"}) public class XXApplic

随机推荐