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

如何在所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:06