如何为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
相关产品推荐
相关产品推荐

