@SuperBuilder

@SuperBuilder的用法

@SuperBuilder 是 Lombok 提供的一个注解,用于生成一个具有父类和子类构建器的构建器模式。它可以让你更方便地创建复杂对象,尤其是在继承层次结构中。下面是一个简单的例子来展示它的用法:

示例代码

假设我们有一个父类 Parent 和一个子类 Child

import lombok.Getter;
import lombok.experimental.SuperBuilder;

@Getter
@SuperBuilder
public class Parent {
    private final String parentField;
}

@Getter
@SuperBuilder
public class Child extends Parent {
    private final String childField;
}

使用构建器创建对象

你可以使用生成的构建器来创建 ParentChild 对象:

public class Main {
    public static void main(String[] args) {
        Parent parent = Parent.builder()
                              .parentField("Parent Field Value")
                              .build();

        Child child = Child.builder()
                           .parentField("Parent Field Value")
                           .childField("Child Field Value")
                           .build();

        System.out.println("Parent Field: " + parent.getParentField());
        System.out.println("Child Parent Field: " + child.getParentField());
        System.out.println("Child Field: " + child.getChildField());
    }
}

解释

  1. 注解@SuperBuilder 注解用于生成构建器模式的代码。
  2. 父类构建器Parent.builder() 用于创建 Parent 对象。
  3. 子类构建器Child.builder() 用于创建 Child 对象,并且可以设置父类和子类的字段。

注意事项

  • 不可变对象@SuperBuilder 通常用于创建不可变对象,因为它会生成 final 字段。
  • 继承@SuperBuilder 支持继承关系,可以在子类中设置父类的字段。

通过使用 @SuperBuilder,你可以简化复杂对象的创建过程,尤其是在有继承关系的情况下。

为什么final字段不需要赋初始值

在 Java 中,final 字段必须在对象构造完成之前被赋值。通常有以下几种方式来赋值 final 字段:

  1. 在声明时赋值

    private final String parentField = "default value";
    
  2. 在构造函数中赋值

    public Parent(String parentField) {
        this.parentField = parentField;
    }
    
  3. 在初始化块中赋值

    {
        parentField = "default value";
    }
    

在使用 Lombok 的 @SuperBuilder 注解时,Lombok 会自动生成一个构造函数,并在构造函数中为 final 字段赋值。因此,你不需要显式地在代码中为 final 字段赋值。Lombok 会确保在对象构造完成之前,所有的 final 字段都已经被正确赋值。

生成的代码示例

假设我们有以下类:

@Getter
@SuperBuilder
public class Parent {
    private final String parentField;
}

Lombok 会生成类似于以下的代码:

public class Parent {
    private final String parentField;

    private Parent(ParentBuilder<?, ?> b) {
        this.parentField = b.parentField;
    }

    public static ParentBuilder<?, ?> builder() {
        return new ParentBuilderImpl();
    }

    public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
        private String parentField;

        public B parentField(String parentField) {
            this.parentField = parentField;
            return self();
        }

        protected abstract B self();

        public abstract C build();
    }

    private static final class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
        @Override
        protected ParentBuilderImpl self() {
            return this;
        }

        @Override
        public Parent build() {
            return new Parent(this);
        }
    }
}

在这个生成的代码中,ParentBuilder 类负责构建 Parent 对象,并在构造函数中为 final 字段 parentField 赋值。因此,当你使用 Parent.builder().parentField("value").build() 时,Lombok 会确保 parentField 在构造函数中被正确赋值。

总结

Lombok 的 @SuperBuilder 注解会自动生成构造函数,并在构造函数中为 final 字段赋值,因此你不需要显式地在代码中为 final 字段赋值。这是 Lombok 提供的便利之一,使得代码更加简洁和易于维护。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@SuperBuilder是一个注解,用于简化Java类的构建过程。它是基于Lombok库的一个功能,提供了一种更方便的方法来构建类,特别是在存在继承关系的类中。 使用@SuperBuilder注解时,需要注意以下几点: 1. 基类和派生类不能同时存在@Builder注解。如果基类使用了@SuperBuilder注解,那么派生类必须要有@SuperBuilder注解或者提供一个构造方法,参数为基类Builder<?, ?>。 2. @SuperBuilder注解并不支持像@Builder注解那样,对非final字段设置默认值。 3. 使用@SuperBuilder注解时,可以使用builderMethodName属性来指定创建内部静态类的方法名,默认值为"builder";使用buildMethodName属性来指定创建实体类的方法名,默认值为"build";使用toBuilder属性设置为true可以对对象进行拷贝生成新的对象并进行修改,默认值为false;使用setterPrefix属性来指定setter方法的前缀。 以下是一个使用@SuperBuilder注解的例子: ```java @SuperBuilder public class XuXiaoHan { private Integer age; private String name; } @SuperBuilder public class ChenYao extends XuXiaoHan { public static void main(String[] args) { ChenYao.builder().name("陈瑶").build(); } } ``` 在这个例子中,XuXiaoHan类和ChenYao类都使用了@SuperBuilder注解。XuXiaoHan类和ChenYao类都可以使用builder()方法来创建对象,并可以链式地设置属性值。在ChenYao类的main方法中,我们可以看到如何使用@SuperBuilder注解来创建ChenYao对象,并设置name属性的值为"陈瑶"。 总之,@SuperBuilder注解是用来简化Java类的构建过程的,特别适用于存在继承关系的类。它提供了一种更方便的方法来创建对象并设置属性值。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你这个代码我看不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值