Java中注解@Builder分析及用法

@Builder

介绍

在 Java 中,@Builder 是 Lombok 库提供的一个注解,用于自动生成建造者模式(Builder Pattern)所需的代码。建造者模式是一种用于创建复杂对象的设计模式,它将对象的构造与表示分离,使得同样的构造过程可以创建不同的表示。@Builder 注解使这个过程更加简洁。

使用方式

1、添加依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

2、示例
示例 1:在类上使用 @Builder
在类上直接使用 @Builder 注解会为这个类生成一个包含所有字段的建造者:

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Person {
    private String firstName;
    private String lastName;
    private int age;

    public static void main(String[] args) {
        Person person = Person.builder()
                              .firstName("John")
                              .lastName("Doe")
                              .age(30)
                              .build();
        System.out.println(person);
    }
}

输出:

Person(firstName=John, lastName=Doe, age=30)

示例 2:在构造方法上使用 @Builder
也可以只为特定的构造方法或静态方法生成建造者。

import lombok.Builder;
import lombok.ToString;

@ToString
public class Vehicle {
    private String make;
    private String model;
    private int year;

    @Builder
    public Vehicle(String make, String model, int year) {
        this.make = make;
        this.model = model;
        this.year = year;
    }

    public static void main(String[] args) {
        Vehicle vehicle = Vehicle.builder()
                                 .make("Toyota")
                                 .model("Camry")
                                 .year(2023)
                                 .build();
        System.out.println(vehicle);
    }
}

示例 3:在静态方法上使用 @Builder
使用 @Builder 注解静态方法时,需要配合 @Builder 的 builderMethodName 属性自定义构建方法的名称。

import lombok.Builder;
import lombok.ToString;

@ToString
public class Address {
    private String city;
    private String street;
    private String zipCode;

    @Builder(builderMethodName = "createAddress")
    public static Address of(String city, String street, String zipCode) {
        Address address = new Address();
        address.city = city;
        address.street = street;
        address.zipCode = zipCode;
        return address;
    }

    public static void main(String[] args) {
        Address address = Address.createAddress()
                                 .city("New York")
                                 .street("5th Avenue")
                                 .zipCode("10001")
                                 .build();
        System.out.println(address);
    }
}

可选属性

builderMethodName:指定构建器方法的名称。默认值为 builder。
buildMethodName:指定最终生成对象的方法名称。默认值为 build。
toBuilder:布尔值,如果为 true,则生成 toBuilder 方法用于克隆对象并修改其字段。
setterPrefix:用于给所有设置方法加前缀,例如设置 setterPrefix = “with” 则生成 withAge 之类的方法。

<think>我们正在讨论Java中的@Builder注解,根据引用资料,我们可以总结如下:@Builder注解是Lombok库提供的注解之一,用于自动生成建造者模式的代码。它的主要作用是简化对象的创建过程,特别是当对象有很多可选参数时。作用:1.自动生成一个静态内部类Builder,并为原始类中的每个非静态字段生成对应的setter方法(在Builder类中)。2.提供一种流畅的API(链式调用)来设置对象属性。3.避免编写多个构造器或大量的setter方法,使代码更简洁。用法:1.在类上使用@Builder注解,会为这个类生成一个包含所有字段的建造者。2.可以通过`类名.builder()`获取Builder实例,然后链式调用属性设置方法,最后调用`build()`方法创建对象。示例(根据引用[1]):```javaimportlombok.Builder;importlombok.ToString;@Builder@ToStringpublicclassPerson{privateStringfirstName;privateStringlastName;privateintage;publicstaticvoidmain(String[]args){Personperson=Person.builder().firstName("John").lastName("Doe").age(30).build();System.out.println(person);}}```在这个例子中,我们不需要自己编写Builder类,Lombok会自动生成。我们通过`Person.builder()`开始,然后链式设置属性,最后调用`build()`得到Person对象。注意事项(根据引用[4]和[5]):-使用了@Builder注解的类必须具有一个无参的构造函数(如果没有其他构造函数,Lombok会生成,但如果有带参构造则需要自己处理)。-@Builder也可以用在方法上(比如为某个复杂的构造过程提供建造者),但通常用在类上。另外,引用[2]和[3]也提供了类似的用法示例。相关问题:1.@Builder注解在继承中如何使用?2.如何自定义@Builder注解生成的方法名称?3.@Builder注解与构造函数注入的方式相比有什么优缺点?4.在Spring框架中如何使用@Builder注解?5.如何在使用@Builder时设置默认值?</think>### Java @Builder 注解详解 #### 一、核心作用 @Builder 是 Lombok 库提供的注解,用于**自动生成建造者模式**代码: 1. **简化对象创建**:通过链式调用设置属性值 2. **避免构造器污染**:解决多参数构造器可读性差的问题 3. **提升代码可维护性**:自动生成 Builder 类,减少样板代码 4. **支持默认值**:可为属性设置初始值(需结合 `@Builder.Default`) 5. **线程安全**:每个构建过程独立创建新对象[^5] #### 二、使用方式 ##### 1. 基础用法(类级别) ```java import lombok.Builder; @Builder public class User { private Long id; private String username; private String email; } // 使用示例 User user = User.builder() .id(1L) .username("john_doe") .email("[email protected]") .build(); ``` ##### 2. 方法级别(自定义构建) ```java public class Order { private String id; @Builder public static Order createOrder(String orderId) { Order order = new Order(); order.id = "ORDER_" + orderId; return order; } } // 调用方式 Order order = Order.createOrderBuilder().orderId("123").build(); ``` ##### 3. 设置默认值 ```java @Builder public class Config { @Builder.Default private int timeout = 30; // 默认值30 @Builder.Default private String mode = "production"; } ``` #### 三、实现原理 Lombok 在编译期自动生成以下代码: 1. 静态内部类 `Builder`,包含与原类相同的属性 2. 链式 setter 方法(返回 Builder 自身) 3. `build()` 方法构造最终对象 4. `builder()` 静态入口方法[^4][^5] ```mermaid classDiagram class User { -Long id -String username -String email +builder() Builder } class UserBuilder { -Long id -String username -String email +id(Long id) UserBuilder +username(String username) UserBuilder +email(String email) UserBuilder +build() User } User ..> UserBuilder : 生成 ``` #### 四、适用场景 1. **复杂对象创建**:需要设置多个属性的对象 2. **可选参数场景**:部分属性需要缺省值 3. **不可变对象**:结合 `@Value` 创建线程安全对象 4. **DTO 对象构建**:API 数据传输对象[^3] #### 五、注意事项 1. **构造器冲突**:若自定义了构造器,需添加 `@AllArgsConstructor` 2. **继承限制**:父类字段不会自动包含在 Builder 中(需用 `@SuperBuilder`) 3. **集合初始化**:集合属性需手动初始化(避免 NPE) 4. **Jackson 序列化**:需配合 `@JsonDeserialize(builder=类名.Builder.class)`[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值