Java Builder模式的写法和lombok插件@Builder注解的支持

本文介绍了如何使用Builder模式简化复杂对象的创建过程,通过定义静态内部类或使用lombok库的@Builder注解,避免了繁琐的getset方法。提供了具体的代码示例,展示了在Java中创建User对象的两种不同方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Builder模式简化get set方法,只需要定义一个静态公共的内部类即可

public class User {
    private Integer id;
    private String name;
    private String address;

    private User() {
    }

    private User(User origin) {
        this.id = origin.id;
        this.name = origin.name;
        this.address = origin.address;
    }

    public static class Builder {
        private User target;

        public Builder() {
            this.target = new User();
        }

        public Builder id(Integer id) {
            target.id = id;
            return this;
        }

        public Builder name(String name) {
            target.name = name;
            return this;
        }

        public Builder address(String address) {
            target.address = address;
            return this;
        }

        public User build() {
            return new User(target);
        }
    }

2.如果项目中有使用lombok的话,可以直接使用@Builder注解来实现

定义工具类如下:

import lombok.Builder;
import lombok.ToString;

/**
 * @author wulongtao
 */
@ToString
@Builder
public class UserExample {
    private Integer id;
    private String name;
    private String address;
}

使用方法:

UserExample userExample = UserExample.builder()
                .id(1)
                .name("aaa")
                .address("bbb")
                .build();

System.out.println(userExample);

转载于:https://blog.youkuaiyun.com/u014520745/article/details/82835373

### Lombok 中 `@Builder` `@Accessors` 注解详解 #### 使用方法及功能描述 #### @Builder 注解 `@Builder` 是 Lombok 提供的一个强大工具,用于简化对象的创建过程。通过此注解可以在编译时自动生成一个内部静态类 Builder 及其相关的方法,从而实现流畅的 API 设计模式。 当与 `@Data` 结合使用时需要注意添加无参构造函数 (`@NoArgsConstructor`) 全参构造函数 (`@AllArgsConstructor`) 来确保正常工作[^1]。下面是一个简单的例子展示如何利用 `@Builder` 创建并初始化对象: ```java import lombok.Builder; import lombok.Data; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Person { private String firstName; private String lastName; } ``` 这样就可以像下面这样轻松地实例化对象了: ```java Person person = Person.builder() .firstName("John") .lastName("Doe") .build(); ``` #### @Accessors 注解 另一方面,`@Accessors` 主要用来定制 getter/setter 方法的行为。比如可以通过设置前缀参数让生成的方法忽略特定前缀字符;也可以开启链式调用特性使得每次 setter 调用返回当前对象本身以便连续赋值操作而不需要额外变量存储中间状态[^3]。 这里有一个具体的案例说明带有前缀配置的 `@Accessors` 如何影响成员变量访问器名称: ```java import lombok.Accessors; import lombok.Getter; import lombok.Setter; @Getter @Setter @Accessors(prefix = "p") class User { private Long pId; private String pName; } // 产生的 Getter/Setter 将会是 getId(), setId(Long), getName(), setName(String) ``` 对于启用链条特性的场景,则有如下写法: ```java import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) static class EmsUser { private String email; private String mobile; } EmsUser user = new EmsUser().setEmail("example@example.com").setMobile("1234567890"); ``` #### 关键差异比较 | 特性 | @Builder | @Accessors | |--------------------|---------------| | **主要用途** | 构建复杂不可变对象 | 定制 Getters/Setters 行为 | | **链式调用支持** | 自动提供 | 需显式声明 (chain=true) | | **默认值设定** | 支持 | 不直接涉及 | | **性能开销** | 较高(因为引入了额外 builder 类) | 更低 | 综上所述,在选择这两个注解之一之前应该考虑具体需求以及项目上下文中哪个更适合解决问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值