基于Lombok的条件式Human对象构建冗余代码优化问询
答案:Lombok完全支持你想要的精简写法,还有更优的方案!
首先明确:Lombok生成的Builder类天生支持链式调用的中途修改,因为每个属性设置方法都会返回Builder实例本身(也就是return this;),所以你不需要重新赋值,直接在原Builder对象上继续调用方法即可。
直接实现你想要的精简逻辑
你的思路是对的,而且可以更简洁——不需要重新赋值变量,直接在已有的Builder实例上调用条件内的方法:
// 创建Builder并设置公共属性 Human.HumanBuilder humanBuilder = Human.builder() .speaks("english") .alive(true); // 根据条件设置差异属性 if (gender.equals("male")) { humanBuilder.gender('male').name("abc"); } else { humanBuilder.gender('female').name("abcd"); } // 最终构建对象 return humanBuilder.build();
更简洁的三元表达式写法(适合2种条件的场景)
如果只有男女两种条件,用三元表达式可以把代码压缩到一个链式调用里,可读性也不错:
return Human.builder() .speaks("english") .alive(true) .gender(gender.equals("male") ? 'male' : 'female') .name(gender.equals("male") ? "abc" : "abcd") .build();
多条件场景的最优方案(比如10种性别/类型)
如果有大量条件分支,把差异属性的配置逻辑抽成单独的方法会让代码更易维护:
// 抽离条件配置逻辑 private void configureSpecificProperties(Human.HumanBuilder builder, String gender) { switch(gender) { case "male": builder.gender('male').name("abc"); break; case "female": builder.gender('female').name("abcd"); break; case "non-binary": builder.gender('non-binary').name("abcde"); break; // 其他更多分支... } } // 调用处 Human.HumanBuilder builder = Human.builder() .speaks("english") .alive(true); configureSpecificProperties(builder, gender); return builder.build();
DropWizard环境的兼容性
完全不用担心DropWizard的适配问题——Lombok是编译时注解处理器,只会在编译阶段生成Builder的字节码,运行时和普通手写的Builder没有区别,DropWizard的依赖注入、序列化等功能都能正常处理Lombok生成的对象。
额外小提示
如果你的Human类用了@Data + @Builder(或者单独的@Builder),Lombok会自动生成返回自身的链式方法,不需要额外配置。如果需要自定义Builder行为,可以用@Builder的参数(比如builderClassName),只要保持每个属性方法返回this即可。
内容的提问来源于stack exchange,提问作者NoobEditor
相关产品推荐
相关产品推荐

