如何在所有Setter中复用相同条件判断以遵循DRY原则?
优化Setter中重复校验逻辑的几种方案
你的顾虑完全合理——在每个Setter里重复写相同的条件判断确实不是最优实践,不仅代码冗余,后期维护成本也高(比如要新增或修改禁用值时,得逐个修改所有Setter)。下面给你几个更优雅的优化思路:
1. 提取公共校验方法(最直接的方案)
把重复的校验逻辑抽成一个私有工具方法,所有Setter都调用这个方法来处理输入值。这样既实现了代码复用,后续修改规则也只需要改这一处。
示例代码:
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class YourEntity { private String buildingNumber; private String floorNumber; private String roomCode; // 把无效值定义为静态常量集合,用HashSet提升contains方法的效率 private static final Set<String> INVALID_VALUES = new HashSet<>(Arrays.asList("-1", "0", "N/A")); // 公共校验方法,加入null判断避免空指针 private String sanitizeInput(String input) { if (input == null || INVALID_VALUES.contains(input)) { return null; } return input; } public void setBuildingNumber(String buildingNumber) { this.buildingNumber = sanitizeInput(buildingNumber); } public void setFloorNumber(String floorNumber) { this.floorNumber = sanitizeInput(floorNumber); } public void setRoomCode(String roomCode) { this.roomCode = sanitizeInput(roomCode); } }
2. 使用Builder模式(适合多字段场景)
如果你的类有很多字段,或者希望在对象构建阶段就完成校验,可以改用Builder模式,在Builder的字段设置方法中统一处理校验逻辑,最后再构建出不可变对象:
示例代码:
public class YourEntity { private final String buildingNumber; private final String floorNumber; private YourEntity(Builder builder) { this.buildingNumber = builder.buildingNumber; this.floorNumber = builder.floorNumber; } public static class Builder { private static final Set<String> INVALID_VALUES = new HashSet<>(Arrays.asList("-1", "0", "N/A")); private String buildingNumber; private String floorNumber; private String sanitize(String input) { return input == null || INVALID_VALUES.contains(input) ? null : input; } public Builder buildingNumber(String buildingNumber) { this.buildingNumber = sanitize(buildingNumber); return this; } public Builder floorNumber(String floorNumber) { this.floorNumber = sanitize(floorNumber); return this; } public YourEntity build() { return new YourEntity(this); } } }
3. 进阶:自定义注解+AOP(适合全局统一规则)
如果你的项目中有很多类都需要这种校验逻辑,可以自定义一个注解(比如@InvalidValueFilter),然后用AOP切面拦截所有标记了该注解的Setter方法,自动完成校验。这种方式更灵活,也能避免侵入业务代码,但需要对Spring AOP或AspectJ有一定了解。
小提醒
如果不同字段的无效值规则有差异,那每个Setter单独处理是合理的;但如果规则完全一致,一定要复用逻辑——这不仅是代码整洁的问题,更能避免因漏改某个Setter而导致的bug。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

