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

