idea的lombok插件支持@SuperBuilder及用法

关于@SuperBuilder

首先了解@Builder

看到这篇文章的你肯定已经用过这个注解,这里简单陈述一下基本用法,如果你已经了解,可以略过此部分。

引入依赖(Maven结构)

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <scope>provided</scope>
</dependency>

创建一个类

/**
 * @author lingxi
 * @date 2021/2/2 19:09
 */
@SuperBuilder(toBuilder = true) //toBuilder属性默认关闭,如果开启,则所有的父类应该也要开启
@Getter
public class Child extends Parent{
    
    
    
}

@SuperBuilder(toBuilder = true)
@Getter
public class Parent {
    
    

    private Integer age;
    private String name;
}

这里使用@Builder注解,就可以在创建新实例的时候这样写:

    /**
     * @SuperBuilder 测试
     */
    @Test
    public void superBuilderTest() {
    
    

        // 子类继承父类,需要父类和子类都要添加注解@SuperBuilder
        Child aaa = Child.builder().age(12).name("aaa").build();
        System.out.println(aaa.getName());
        // toBuilder属性默认关闭,如果开启,则所有的父类应该也要开启
        // 这是一个类似深拷贝的一个方法,不会改变原有实例的属性,生成一个新的实例
        Child nbbb = aaa.toBuilder().name("nbbb").build();
        System.out.println(nbbb.getName());


    }

可以看到,我们只要写一个@Builder注解,有如下好处:

一个注解代替若干参数情况下的构造函数,缩减了构造类的代码量
通过Builder构造的方式,即.属性名(值)这样的方式,比直接使用构造函数的方式更加具备可读性,比频繁使用set方法的方式更加简洁。
2.2. 了解@SuperBuilder
2.2.1. @SuperBuilder解决了什么样的问题
在上文(2.1)中,我们了解了@Builder的使用,那么我们将例子中的Ming这个类的成员属性放到父类当中:

public class Person {
    
    
    private Integer age;
    private String name;
}

@Builder
public class Ming extends Person{
    
    
}

这个时候,我们之前的调用的.builder都会报错,这是因为@Builder并不支持父类成员属性的构造,@SuperBuilder注解的出现,就是用来解决这个问题。

@SuperBuilder
public class Person {
    
    
    private Integer age;
    private String name;
}

@SuperBuilder
public class Ming extends Person{
    
    
}

这样子类就可以正常获取到父类的成员属性进行builder构造了。

@SuperBuilder(toBuilder = true)用法
toBuilder属性默认关闭,如果开启,则所有的父类应该也要开启,效果如下:

Ming mingD = Ming.builder()
      .age(11)
      .name("小明")
      .build();
Ming mingF = mingD.toBuilder().name("猪").build();
System.err.println(mingD.toString());
System.err.println(mingF.toString());

通过设置true,所有的类实例会拥有toBuilder方法,这是一个类似深拷贝的一个方法,不会改变原有实例的属性,生成一个新的实例。在toBuilder中有赋值的属性则会改变为赋值属性,没有赋值的以调用的实例中的值为准。

2.2.3. @SuperBuilder(buildMethodName = “execute”, builderMethodName = “helloWorld”, toBuilder = true) 用法
这个用法其实没什么意思,就是自定义方法名,不展开赘述。

2.2.4. @Builder.ObtainVia(XXX) 用法
这个是Filed或parameter的注解,我们看下源码

@Target({
    
    FIELD, PARAMETER})
@Retention(SOURCE)
public @interface ObtainVia {
    
    
		/**
		 * @return Tells lombok to obtain a value with the expression {@code this.value}.
		 */
		String field() default "";
		
		/**
		 * @return Tells lombok to obtain a value with the expression {@code this.method()}.
		 */
		String method() default "";
		
		/**
		 * @return Tells lombok to obtain a value with the expression {@code 			   SelfType.method(this)}; requires {@code method} to be set.
		 */
		boolean isStatic() default false;
}

其中,

field是告诉lombok赋值时从哪个属性取值
method是告诉lombok赋值时调用什么方法
isStatic是跟在method后的,默认为false,代表相应的method是否是静态
需要注意的是这几个方法只有在ToBuilder = true的时候有效,最好不要混合使用(有先后顺序问题)

2.2.5. 注意补充构造方法
2019-10-10 更新

使用@Builder或@SuperBuilder注解时,不会默认创建空参构造函数,如果你有额外使用空参构造函数或全参构造函数的需求,需要在子类和父类都加上以下注解:

@AllArgsConstructor //全参构造函数
@NoArgsConstructor //空参构造函数
  1. 参考文献
    @SuperBuilder - lombok官网

猜你喜欢

转载自blog.csdn.net/qq_40093255/article/details/111028490
今日推荐