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

Lombok @Builder构建对象时如何实现字段依赖其他字段赋值

问题根因

你当前写法里key字段的初始化逻辑会在对象实例化的字段初始化阶段执行,这时候Builder还没把链式调用传入的value1、value2赋值给实例字段,两个值都是null,自然算不出正确的加密结果。

可行实现方式

方式一:自定义Builder的build逻辑,赋值完成后计算key

Lombok允许你手动编写Builder类的部分逻辑来覆盖默认生成的代码,你可以重写build方法,等所有字段都赋值完成后再计算key值,完全兼容你原来的链式调用写法:

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class MyModel {

    @DynamoDBHashKey
    private String key;

    @DynamoDBAttribute
    private String value1;

    @DynamoDBAttribute
    private String value2;

    // 手写Builder内部类的build方法,覆盖Lombok默认生成的逻辑
    public static class MyModelBuilder {
        public MyModel build() {
            // 先走默认逻辑生成实例,完成value1、value2的赋值
            MyModel model = new MyModel(this.key, this.value1, this.value2);
            // 所有字段赋值完成后,计算key值
            model.key = encrypt(model.value1, model.value2);
            return model;
        }
    }

    // 替换成你实际的加密实现
    private static String encrypt(String v1, String v2) {
        return v1 + "_" + v2;
    }
}

如果需要支持手动传入key值覆盖自动计算结果,只需要在build方法里加个判断:if (this.key == null) { 执行自动计算逻辑 }即可。

方式二:不单独存key字段,通过getter动态计算

如果你的DynamoDB mapper支持注解放到getter方法上,可以直接去掉key的字段定义,写对应的get方法实时计算返回值:

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class MyModel {

    @DynamoDBAttribute
    private String value1;

    @DynamoDBAttribute
    private String value2;

    // 把DynamoDB的注解放到getter上,每次取值实时计算
    @DynamoDBHashKey
    public String getKey() {
        return encrypt(this.value1, this.value2);
    }

    private static String encrypt(String v1, String v2) {
        // 替换成实际加密逻辑
        return v1 + "_" + v2;
    }
}

这种写法的好处是后续如果修改了value1或者value2的值,调用getKey()永远能拿到和当前字段匹配的结果,不会出现字段更新了key没同步的问题。

避坑提醒

不要用@Builder.Default注解给key设置计算逻辑,这个注解的作用是给Builder设置未传值时的字段默认值,执行时机早于其他字段的赋值,解决不了字段依赖的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:06:12