【注解】@Builder、@SuperBuilder Lombok 中的建设者

发布时间:2024年01月13日

@Builder@SuperBuilder 是 Lombok 中用于生成建造者模式的注解。
关于建设者模式详情参考【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例)

1、@Builder:

@Builder: 用于标记在类上,会为类生成一个默认的无参的构造方法,并生成一个具有所有成员变量的建造者。它还为类中的每个非静态字段生成相应的设置方法,并返回当前建造者对象。通过链式调用这些设置方法,可以便捷地构建对象。

import lombok.Builder;

@Builder
public class Example {
    private String name;
    private int age;
}

在使用中,可以通过 Example.builder().name("John").age(30).build() 的方式构建对象。

2、@SuperBuilder:

@SuperBuilder: 是 @Builder 的一个扩展,用于生成包含父类字段的建造者。如果子类使用 @SuperBuilder,则生成的建造者中包含父类的字段设置方法。

import lombok.experimental.SuperBuilder;

@SuperBuilder
public class Parent {
    private String parentField;
}

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

在使用中,可以通过 Child.builder().parentField("ParentValue").childField("ChildValue").build() 的方式构建子类对象。

这两个注解简化了对象的构建过程,尤其在有多个字段需要设置时,通过链式调用的方式可以更清晰地表达构建逻辑。

如果子类使用 @Builder,生成的建造者中不会包含父类的字段设置方法。 @SuperBuilder 是专门用于包含父类字段的建造者生成的扩展。如果使用 @Builder,需要手动处理父类字段的设置。

3、不足

虽然 Lombok 的 @Builder 注解在简化对象构建方面提供了便利,但也存在一些潜在的不足之处:

  • 不支持继承@Builder 不支持继承关系。如果一个类使用了 @Builder
    注解,其子类不会继承该注解生成的构建方法,而是需要在子类中重新声明。这个@SuperBuilder 升级弥补了这个不足。
  • 限制可变性@Builder 生成的构建器是不可变的,即一旦对象被构建,就不能再修改其属性。这在一些特定场景下可能不太灵活,特别是需要在创建对象后再进行修改的情况。某些应用场景下这也是优点。
  • 缺少清晰的方法调用链: 在复杂的对象构建过程中,@Builder 生成的代码可能导致方法调用链不够清晰,难以一眼看清对象的构建流程。
  • 生成的代码较为庞大@Builder 在生成构建器的过程中会生成大量的代码,可能导致最终的类文件较为庞大。这在一些对代码大小敏感的环境中可能不是理想的选择。
  • 可能引入空指针异常: 如果在构建对象时不提供某个必需的属性,@Builder 生成的构建器在设置属性时可能引发空指针异常。在这方面,使用构造方法和在运行时进行校验可能更为安全。
  • 不支持默认值: Lombok 的 @Builder 不支持为属性设置默认值。如果想要在构建对象时为属性提供默认值,需要手动在构造方法中设置。(这个很容易出错)

尽管有这些不足,@Builder 仍然是一个很有用的注解,可以在简化对象构建的同时提高代码的可读性。在实际使用时,需要根据具体场景权衡其优势和不足。

文章来源:https://blog.csdn.net/weixin_45188218/article/details/135556022
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。