@Builder
和 @SuperBuilder
是 Lombok 中用于生成建造者模式的注解。
关于建设者模式详情参考【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例)
@Builder
:@Builder
: 用于标记在类上,会为类生成一个默认的无参的构造方法,并生成一个具有所有成员变量的建造者。它还为类中的每个非静态字段生成相应的设置方法,并返回当前建造者对象。通过链式调用这些设置方法,可以便捷地构建对象。
import lombok.Builder;
@Builder
public class Example {
private String name;
private int age;
}
在使用中,可以通过 Example.builder().name("John").age(30).build()
的方式构建对象。
@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
,需要手动处理父类字段的设置。
虽然 Lombok 的 @Builder
注解在简化对象构建方面提供了便利,但也存在一些潜在的不足之处:
@Builder
不支持继承关系。如果一个类使用了 @Builder
@SuperBuilder
升级弥补了这个不足。@Builder
生成的构建器是不可变的,即一旦对象被构建,就不能再修改其属性。这在一些特定场景下可能不太灵活,特别是需要在创建对象后再进行修改的情况。某些应用场景下这也是优点。@Builder
生成的代码可能导致方法调用链不够清晰,难以一眼看清对象的构建流程。@Builder
在生成构建器的过程中会生成大量的代码,可能导致最终的类文件较为庞大。这在一些对代码大小敏感的环境中可能不是理想的选择。@Builder
生成的构建器在设置属性时可能引发空指针异常。在这方面,使用构造方法和在运行时进行校验可能更为安全。@Builder
不支持为属性设置默认值。如果想要在构建对象时为属性提供默认值,需要手动在构造方法中设置。(这个很容易出错)尽管有这些不足,@Builder
仍然是一个很有用的注解,可以在简化对象构建的同时提高代码的可读性。在实际使用时,需要根据具体场景权衡其优势和不足。