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

如何为Java Record生成多字段修改的With方法或自定义该方法?

问题场景

我定义了带有@Builder和@With注解的DepotRecord记录(实际包含更多字段):

@Builder
@With
public record DepotRecord(Long id, String x, String y, String z, String a) {}

Lombok会自动生成单字段修改的with方法,例如:

public DepotRecord withId(final Long id) {
    return this.id == id ? this : new DepotRecord(id, this.x, this.y, this.z, this.a);
}

在少数场景下,我需要同时修改多个字段,希望自动生成类似如下的多字段修改方法:

public DepotRecord withIdXY(final Long id, String x, String y) {
    return this.id == id && this.x.equals(x) && this.y.equals(y) ? this : new DepotRecord(id, x, y, this.z, this.a);
}

请问是否有办法自动生成这类方法?或者如何自定义该方法?

解决方案

1. 手动自定义方法(推荐,适合少数场景)

Java Record允许直接在类体中添加自定义方法,这是最简单直接的方式:

@Builder
@With
public record DepotRecord(Long id, String x, String y, String z, String a) {
    // 自定义多字段修改方法
    public DepotRecord withIdXY(final Long id, String x, String y) {
        // 添加全字段相等判断,避免创建不必要的对象
        if (Objects.equals(this.id, id) && Objects.equals(this.x, x) && Objects.equals(this.y, y)) {
            return this;
        }
        return new DepotRecord(id, x, y, this.z, this.a);
    }
}

这种方式可控性强,不需要依赖额外工具,适合仅需少数多字段修改方法的场景。

2. 利用@Builder链式调用替代

由于已经使用@Builder注解,Lombok会生成toBuilder()方法,可通过链式调用一次性修改多个字段,效果与自定义方法类似:

// 修改id、x、y三个字段
DepotRecord updatedRecord = originalRecord.toBuilder()
    .id(newId)
    .x(newX)
    .y(newY)
    .build();

该方式无需编写额外方法,灵活度高,适合动态修改不同字段组合的场景。

3. 自定义Lombok扩展(复杂,适合批量需求)

如果项目中有大量类似多字段修改需求,可自定义Lombok注解处理器生成这类方法,但开发成本较高,需要熟悉Lombok扩展机制,仅适合团队级统一需求场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:55:19