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

如何在Java代码中泛化比较逻辑以避免重复代码?

解决Filter实现类中比较策略重复代码的泛化方案

你现在的问题是每个Filter实现类都要重复编写switch判断ComparisonStrategy的逻辑,导致代码冗余。这里有两个可行的方案来避免重复:

方案一:用抽象基类封装通用范围比较逻辑

把重复的策略判断逻辑抽到抽象基类里,子类只需要实现获取待比较数值的方法即可。

首先明确ComparisonStrategy枚举(补全供参考):

public enum ComparisonStrategy {
    EXCLUSIVE, INCLUSIVE
}

创建抽象基类RangeFilter:

public abstract class RangeFilter implements Filter {
    private final double min;
    private final double max;
    private final ComparisonStrategy strategy;

    protected RangeFilter(double min, double max, ComparisonStrategy strategy) {
        this.min = min;
        this.max = max;
        this.strategy = strategy;
    }

    // 子类必须实现该方法,返回要和范围比较的地震属性值
    protected abstract double getTargetValue(Earthquake earthquake);

    @Override
    public boolean satisfies(Earthquake earthquake) {
        double targetValue = getTargetValue(earthquake);
        return switch (strategy) {
            case EXCLUSIVE -> targetValue > min && targetValue < max;
            case INCLUSIVE -> targetValue >= min && targetValue <= max;
        };
    }
}

简化后的MagnitudeFilter,无需重复编写switch:

public final class MagnitudeFilter extends RangeFilter {
    public MagnitudeFilter(double minimumMagnitude, double maximumMagnitude, ComparisonStrategy strategy) {
        super(minimumMagnitude, maximumMagnitude, strategy);
    }

    @Override
    protected double getTargetValue(Earthquake earthquake) {
        return earthquake.magnitude();
    }
}

后续新增其他范围类Filter(比如DepthFilter),只需继承基类实现取值方法:

public final class DepthFilter extends RangeFilter {
    public DepthFilter(double minDepth, double maxDepth, ComparisonStrategy strategy) {
        super(minDepth, maxDepth, strategy);
    }

    @Override
    protected double getTargetValue(Earthquake earthquake) {
        return earthquake.depth();
    }
}

方案二:把比较策略封装成独立的函数式接口

把不同策略的比较逻辑抽成函数,让Filter类直接复用,彻底消除重复的switch代码。

定义函数式接口封装范围比较逻辑:

@FunctionalInterface
public interface RangeChecker {
    boolean isInRange(double value, double min, double max);
}

给ComparisonStrategy枚举添加获取对应比较器的方法:

public enum ComparisonStrategy {
    EXCLUSIVE {
        @Override
        public RangeChecker getChecker() {
            return (value, min, max) -> value > min && value < max;
        }
    },
    INCLUSIVE {
        @Override
        public RangeChecker getChecker() {
            return (value, min, max) -> value >= min && value <= max;
        }
    };

    public abstract RangeChecker getChecker();
}

简洁版MagnitudeFilter实现,直接调用策略对应的比较器:

public final class MagnitudeFilter implements Filter {
    private final double minimumMagnitude;
    private final double maximumMagnitude;
    private final RangeChecker rangeChecker;

    public MagnitudeFilter(double minimumMagnitude, double maximumMagnitude, ComparisonStrategy strategy) {
        this.minimumMagnitude = minimumMagnitude;
        this.maximumMagnitude = maximumMagnitude;
        this.rangeChecker = strategy.getChecker();
    }

    @Override
    public boolean satisfies(Earthquake earthquake) {
        return rangeChecker.isInRange(earthquake.magnitude(), minimumMagnitude, maximumMagnitude);
    }
}

这种方案灵活性更高,后续新增比较策略只需在枚举中添加实现,所有Filter类均可直接复用。

方案选择建议

  • 如果你的Filter大多是范围类比较,优先用抽象基类方案,代码最简洁,子类开发成本最低。
  • 如果需要更灵活的扩展(比如未来要加非范围的比较策略),函数式接口方案更合适,耦合度更低。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:43:10