如何泛化静态闭包?以验证助手类的实现场景为例
如何泛化静态闭包(针对验证助手类场景)
好的,咱们来解决这个泛化静态验证闭包的问题。你当前的场景是每个类型(String/Number)都有独立的验证助手类,里面既有通用逻辑(比如非空校验),也有类型特有的规则(比如字符串长度/数值大小),泛化的核心是复用通用逻辑,同时保留类型特有的验证能力,还不改变原有的静态调用习惯。
下面给你两种实用的方案:
方案1:基于泛基类的分层复用(保留原Helper类结构)
这种方案会先把通用的验证逻辑抽成一个泛型基类,然后让各个类型的Helper类复用基类的能力,同时添加类型特有的方法。
第一步:确认泛型Validation基础结构
假设你已经有了泛型的Validation接口和SimpleValidation实现,这里先明确(如果你的已有代码和这个一致,可以跳过):
public interface Validation<T> { boolean validate(T value); String getErrorMessage(); } public class SimpleValidation<T> implements Validation<T> { private final Predicate<T> validator; private final String errorMessage; private SimpleValidation(Predicate<T> validator, String errorMessage) { this.validator = validator; this.errorMessage = errorMessage; } public static <T> Validation<T> from(Predicate<T> validator, String errorMessage) { return new SimpleValidation<>(validator, errorMessage); } @Override public boolean validate(T value) { return validator.test(value); } @Override public String getErrorMessage() { return errorMessage; } }
第二步:创建通用泛型基类
把所有类型都通用的验证逻辑(比如非空校验)放到这里:
public class GenericValidationHelper<T> { // 通用非空校验闭包 public final Validation<T> notNull; public GenericValidationHelper() { this.notNull = SimpleValidation.from(t -> t != null, "must not be null."); } // 可选:通用的比较型校验(针对实现Comparable的类型) protected Validation<T> moreThan(T threshold, Comparator<T> comparator, String errorTemplate) { return SimpleValidation.from(t -> comparator.compare(t, threshold) >= 0, String.format(errorTemplate, threshold)); } }
第三步:改造原有的类型Helper类
复用基类的通用逻辑,只实现类型特有的验证规则:
StringValidationHelper
public class StringValidationHelper { // 复用基类的非空校验 private static final GenericValidationHelper<String> GENERIC_HELPER = new GenericValidationHelper<>(); public static final Validation<String> notNull = GENERIC_HELPER.notNull; // 字符串特有的长度校验 public static Validation<String> moreThan(int size) { return SimpleValidation.from(s -> s.length() >= size, String.format("must have more than %s chars.", size)); } // 同理实现lessThan等其他字符串特有的方法 public static Validation<String> lessThan(int size) { return SimpleValidation.from(s -> s.length() <= size, String.format("must have no more than %s chars.", size)); } }
NumberValidationHelper
public class NumberValidationHelper { // 复用基类的非空校验 private static final GenericValidationHelper<Number> GENERIC_HELPER = new GenericValidationHelper<>(); public static final Validation<Number> notNull = GENERIC_HELPER.notNull; // 数值特有的大小校验(支持所有实现Comparable的Number子类) public static <N extends Number & Comparable<N>> Validation<N> moreThan(N threshold) { return SimpleValidation.from(n -> n.compareTo(threshold) >= 0, String.format("must be greater than or equal to %s.", threshold)); } // 同理实现lessThan等数值特有的方法 public static <N extends Number & Comparable<N>> Validation<N> lessThan(N threshold) { return SimpleValidation.from(n -> n.compareTo(threshold) <= 0, String.format("must be less than or equal to %s.", threshold)); } }
方案优点:
- 完全保留你原有的调用习惯(比如
StringValidationHelper.notNull、StringValidationHelper.moreThan(5)) - 通用逻辑只写一次,避免重复代码
- 类型特有的规则依然隔离在各自的Helper类中,符合单一职责
方案2:统一静态工具类(简化类结构)
如果不想维护多个Helper类,可以把所有验证逻辑集中到一个统一的静态工具类里,用命名区分不同类型的方法:
public class ValidationHelpers { // 通用非空校验 public static <T> Validation<T> notNull() { return SimpleValidation.from(t -> t != null, "must not be null."); } // -------------------------- // String类型特有的验证方法 // -------------------------- public static Validation<String> stringMoreThan(int size) { return SimpleValidation.from(s -> s.length() >= size, String.format("must have more than %s chars.", size)); } public static Validation<String> stringLessThan(int size) { return SimpleValidation.from(s -> s.length() <= size, String.format("must have no more than %s chars.", size)); } // -------------------------- // Number类型特有的验证方法 // -------------------------- public static <N extends Number & Comparable<N>> Validation<N> numberMoreThan(N threshold) { return SimpleValidation.from(n -> n.compareTo(threshold) >= 0, String.format("must be greater than or equal to %s.", threshold)); } public static <N extends Number & Comparable<N>> Validation<N> numberLessThan(N threshold) { return SimpleValidation.from(n -> n.compareTo(threshold) <= 0, String.format("must be less than or equal to %s.", threshold)); } }
调用方式:
// 非空校验 Validation<String> stringNotNull = ValidationHelpers.notNull(); // 字符串长度校验 Validation<String> minLength = ValidationHelpers.stringMoreThan(5); // 数值大小校验 Validation<Integer> minValue = ValidationHelpers.numberMoreThan(10);
方案优点:
- 只需要维护一个工具类,结构更简洁
- 泛型方法自动推导类型,使用灵活
- 方法命名清晰,一眼就能看出对应哪种类型的验证
总结建议
- 如果你的项目已经有多个类型的Helper类,且团队习惯按类型分组调用,选方案1,兼容现有代码结构
- 如果是新项目或者希望简化类结构,选方案2,减少类的数量,更易于维护
内容的提问来源于stack exchange,提问作者ProfessorX
相关产品推荐
相关产品推荐

