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

@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 仍然是一个很有用的注解,可以在简化对象构建的同时提高代码的可读性。在实际使用时,需要根据具体场景权衡其优势和不足。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值