Skip to content

@Builder

java

@Builder(toBuilder = true)
@ToString
public class Person {
    String firstName;
    String lastName;
    int age;
    String email;
    String phone;
}

@Builder(toBuilder = true, builderClassName = "ImmutablePersonBuilder", builderMethodName = "personBuilder",
        buildMethodName = "create")
@ToString
@Value
public class ImmutablePerson {
    String firstName;
    String lastName;
    int age;
    String email;
    @Builder.Default
    String phone = "not provided";
}


public class BuilderDemo {
    public static void main(String[] args) {
        Person person = Person.builder().age(1).firstName("jasper").lastName("cliff").email("test@qq.com").build();
        System.out.println("person = " + person);
        Person.PersonBuilder builder = person.toBuilder();
        System.out.println("builder = " + builder);
        Person person1 = builder.phone("1234567890").build();
        System.out.println("person1 = " + person1);


        ImmutablePerson build = ImmutablePerson.personBuilder().age(1).firstName("jasper").lastName("cliff").email("test@qq.com").create();
        System.out.println("build = " + build);
        System.out.println("build.getPhone() = " + build.getPhone());
    }
}

toBuilder: 为现有的实例提供一个转换到 builder 的方法,方便修改现有对象。 builderClassName: 允许指定不同的构建器类名。 builderMethodName: 允许指定不同的构建器方法名。 buildMethodName: 允许指定 build 方法的不同名称 。

@Builder.default 当你在一个类的字段上使用 @Builder.Default 注解时,Lombok 会在生成的构建器中为该字段设置一个默认值。

@Value

@Value 注解被用来创建不可变(immutable)的类。这意味着一旦一个对象被创建,它的状态就不能被改变。 @Value 注解自动为类中的所有字段生成: 私有的最终 (private final) 字段声明。 对应的构造函数,该构造函数接收与类中字段相同类型的参数。 所有字段的公共 getter 方法。 如果类中有任何集合类型(如 List 或 Map),则它们会被初始化为不可变的形式。

访问级别

  • 访问级别:@Builder 默认会生成一个包级私有的(package-private)或私有的(private)构造函数来防止直接实例化。 这是因为 @Builder 的设计理念是鼓励通过构建器模式来创建对象实例,而不是直接通过构造函数。
  • 自定义构造函数可见性:如果你想改变由 @Builder 生成的构造函数的可见性,可以使用 @Builder 的 access 属性来调整。
  • 例如,如果你想让构造函数成为公共的,你可以这样使用 @Builder(access = AccessLevel.PUBLIC)。