You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@Builder能否同时用于对象创建与对象修改?

关于Lombok @Builder 修改已有对象的问题

首先明确:Lombok的@Builder核心设计是用于创建新对象,而非修改已有对象。你尝试用它修改部分属性时生成新对象,这是它的预期行为——因为@Builder本质上基于建造者模式,默认配合全参或无参构造构建全新实例,不会直接修改原有对象的状态。

如果想复用已有对象的属性,只调整部分值,可以用Lombok提供的toBuilder功能:

  • 在类上添加@Builder(toBuilder = true)注解,Lombok会生成toBuilder()方法
  • 调用已有对象的toBuilder(),会基于当前对象的所有属性生成一个建造者实例,之后链式修改需要调整的属性,最后调用build()得到新对象(注意仍是新对象,但复用了原有对象的大部分属性)

举个代码示例:

import lombok.Builder;
import lombok.ToString;

@Builder(toBuilder = true)
@ToString
public class User {
    private String name;
    private int age;
    private String email;
}

// 使用方式
public class Main {
    public static void main(String[] args) {
        User originalUser = User.builder()
                .name("张三")
                .age(25)
                .email("zhangsan@example.com")
                .build();
        
        // 基于原有对象修改部分属性,生成新对象
        User updatedUser = originalUser.toBuilder()
                .age(26)
                .email("zhangsan_new@example.com")
                .build();
        
        System.out.println(originalUser); // User(name=张三, age=25, email=zhangsan@example.com)
        System.out.println(updatedUser); // User(name=张三, age=26, email=zhangsan_new@example.com)
    }
}

但要注意:这种方式依然是创建新对象,不是直接修改原有对象的状态。如果你的需求是直接修改原有对象的属性,@Builder做不到,只能用@Setter或者自己编写自定义修改方法(比如updateAge(int newAge)这类方法)。

总结:

  • 复用已有属性、生成修改后的新对象:用@Builder(toBuilder = true)的toBuilder()方法
  • 直接修改原有对象状态:只能用@Setter或自定义修改方法

内容的提问来源于stack exchange,提问作者you88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:20:21