如何为Lombok Builder添加枚举值额外校验?
解决Lombok Builder限制枚举字段取值的简便方法
针对你的需求,不需要完全自定义Builder或者复杂的自定义注解,有两种简便的实现方式:
方法一:通过全参构造器加入校验逻辑
Lombok的@Builder生成的Builder类,最终会调用目标类的全参构造器创建实例。因此只需手动编写带校验逻辑的全参构造器,就能在build()时自动触发校验:
@Builder(toBuilder = true) public class Testing { @NonNull private String id; @NonNull private TestEnum test; private String message; // 手动实现全参构造器,加入test字段的取值限制 public Testing(@NonNull String id, @NonNull TestEnum test, String message) { this.id = id; // 校验test只能是ALPHA或BETA if (!(test == TestEnum.ALPHA || test == TestEnum.BETA)) { throw new IllegalArgumentException("test字段仅允许取值ALPHA或BETA"); } this.test = test; this.message = message; } }
当使用Builder传入TestEnum.GAMMA调用build()时,会直接抛出IllegalArgumentException,阻断非法实例的创建。
方法二:重写Builder的test方法
如果只想针对test字段的设置过程做校验,可以重写Builder类中的test()方法,在赋值前加入校验:
@Builder(toBuilder = true) public class Testing { @NonNull private String id; @NonNull private TestEnum test; private String message; // 重写Builder的test方法,加入校验逻辑 public static class TestingBuilder { public TestingBuilder test(TestEnum test) { if (!(test == TestEnum.ALPHA || test == TestEnum.BETA)) { throw new IllegalArgumentException("test字段仅允许取值ALPHA或BETA"); } this.test = test; return this; } } }
这种方式更精准,仅在设置test字段时触发校验,Lombok会自动生成Builder的其他方法,无需手动实现完整Builder。
内容的提问来源于stack exchange,提问作者Vegan Vegeta
相关产品推荐
相关产品推荐

