@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://www.bmabk.com/index.php/post/199189.html