【发布时间】:2018-04-28 02:28:15
【问题描述】:
我有以下场景:两个验证助手
StringValidationHelper ...
public class StringValidationHelper {
public static Validation<String> notNull =
SimpleValidation.from(s -> s != null, "must not be null.");
public static Validation<String> moreThan(int size) {
return SimpleValidation.from(
s -> s.length() >= size,
String.format ("must have more than %s chars.", size));
}
... // More methods (lessThan, etc)}
... 和 NumberValidationHelper。
public class NumberValidationHelper {
public static Validation<Number> notNull =
SimpleValidation.from(n -> n != null, "must not be null");
public static <N extends Number & Comparable<N>> Validation<N> lowerThan(N max){
return SimpleValidation.from(
n -> n.compareTo(max) == -1,
String.format("must be lower than %s.", max));
}
... // More methods like (greaterThan, etc)}
from 方法是一个静态工厂方法,它接收一个 Predicate 和一条最终验证失败的消息。
public class SimpleValidation<K> implements Validation<K>{
private Predicate<K> predicate;
private String onErrorMessage;
private SimpleValidation(Predicate<K> predicate, String onErrorMessage) {
this.predicate = predicate;
this.onErrorMessage = onErrorMessage;
}
public static <K> SimpleValidation<K> from(Predicate<K> predicate, String onErrorMessage){
return new SimpleValidation<>(predicate, onErrorMessage);
}
... // Omitted for simplicity
}
感谢验证界面,您可以享受一个非常流畅的界面
@FunctionalInterface
public interface Validation<K> {
... // Omitted for simplicity
default Validation<K> and(Validation<K> other) {
return param -> {
ValidationResult firstResult = this.test (param);
return ! firstResult.isValid()? firstResult: other.test(param);
};
}
... // Omitted for simplicity
}
所以我可以开始,例如,使用闭包 notNull 进行验证。
示例:使用 NumberValidationHelper
public class MyValidate {
void validate(int toValidate) {
notNull.and(lowerThan(100)).test(toValidate).isValid();
}
}
这个验证框架是我根据this文章开发的。
好吧,notNull 包含了一个与类型无关的行为,所以我想删除这两个助手的重复项。 在不丢失流体界面的情况下,我找不到明显的形状。
因为变量是静态的,例如,你不能使用泛型和扩展行为。
public abstract class GenericHelper<K> {
public static Validation<K> notNull = SimpleValidation.from(o -> o != null, "must not be null.");
}
此外,使用 Object 键入验证也不会打扰我,如下所示:
public abstract class GenericHelper {
public static Validation<Object> notNull = SimpleValidation.from(o -> o != null, "must not be null.");
}
... 因为在调用链中,它会给出编译错误,因为 notNull 的结果将是一个 Validation
notNull.and(lowerThan(100)).test(toValidate).isValid(); //Does not compile
有没有什么方法可以使用 Java 8 的函数特性来保持这个接口的通用性,而不是我上面尝试过的解决方案?
感谢
【问题讨论】: