Java essay Java essay
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)

Mr.Fire

全栈工程师
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)
  • Java基础

  • Java进阶

  • 设计模式

  • 多线程

  • 你不知道的小事

    • 别再用BigDecimal给自己挖坑了
    • SuperBuilder
      • @SuperBuilder的用法
      • 示例代码
        • 使用构建器创建对象
        • 解释
        • 注意事项
      • 为什么final字段不需要赋初始值
        • 生成的代码示例
      • 总结
  • Java基础
  • 你不知道的小事
Mr.Fire
2024-12-29
目录

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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 使用构建器创建对象

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

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 解释

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

# 注意事项

不可变对象:@SuperBuilder 通常用于创建不可变对象,因为它会生成 final 字段。 继承:@SuperBuilder 支持继承关系,可以在子类中设置父类的字段。 通过使用 @SuperBuilder,你可以简化复杂对象的创建过程,尤其是在有继承关系的情况下。

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

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

  1. 在声明时赋值:
private final String parentField = "default value";

1
2
  1. 在构造函数中赋值:
public Parent(String parentField) {
    this.parentField = parentField;
}
1
2
3
  1. 在初始化块中赋值:
{
    parentField = "default value";
}
1
2
3

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

# 生成的代码示例

假设我们有以下类:

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

1
2
3
4
5
6

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);
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

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

# 总结

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

原文链接:

https://blog.csdn.net/weixin_43349479/article/details/140485032 (opens new window)

最后更新时间: 2025/01/02, 14:49:49
别再用BigDecimal给自己挖坑了

← 别再用BigDecimal给自己挖坑了

最近更新
01
30岁我该怎么办
12-29
02
关于存钱
12-29
03
打工人的带饭生活
12-29
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Mr.Fire | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式