Я разрабатываю платформу псевдо-проверки в java 8.
До сих пор у меня есть этот интерфейс, который переписывает интерфейс Predicate в java:
@FunctionalInterface
public interface Validation<K> {
public GenericValidationResult test(K param);
default Validation<K> and(Validation<K> other) {
return (param) -> {
GenericValidationResult result = this.test(param);
return !result.isValid() ? result : other.test(param);
};
}
default Validation<K> or(Validation<K> other) {
return (param) -> {
GenericValidationResult result = this.test(param);
return result.isValid() ? result : other.test(param);
};
}
Этот интерфейс реализуется конкретной реализацией, приведенной ниже:
public class GenericValidation<K> implements Validation<K> {
private Predicate<K> predicate;
public static <K> GenericValidation<K> from(Predicate<K> predicate) {
return new GenericValidation<K>(predicate);
}
private GenericValidation(Predicate<K> predicate) {
this.predicate = predicate;
}
@Override
public GenericValidationResult test(K param) {
return predicate.test(param) ? GenericValidationResult.ok() : GenericValidationResult.fail();
}
Ответственность этого заключается в том, чтобы выполнить предикат определенного условия и создать результат, который представлен GenericValidationResult:
public class GenericValidationResult {
private boolean valid;
public boolean isValid() {
return valid;
}
public static GenericValidationResult ok() {
return new GenericValidationResult(true);
}
private GenericValidationResult(boolean valid) {
this.valid = valid;
}
public static GenericValidationResult fail() {
return new GenericValidationResult(false);
}
public Optional<String> getFieldNameIfInvalid(String field) {
return this.valid ? Optional.empty() : Optional.of(field);
}
Это основы моей структуры. Я создал этот класс:
public class ValidatorUtil {
public static final Validation<String> notNullString = GenericValidation.from(s -> s != null);
public static final Validation<Object> notNullObject = GenericValidation.from(s -> s != null);
public static final Validation<String> notEmptyString = GenericValidation.from(s -> !s.isEmpty());
public static final Validation<Integer> notNullInteger = GenericValidation.from(s -> s != null);
public static final Validation<Integer> greaterThanZero = GenericValidation.from(s -> s > 0);
public static final Validation<List> notEmptyList = GenericValidation.from(s -> s != null && !s.isEmpty());
public static final Validation<Enum> notNullEnum = GenericValidation.from(s -> s != null);
public static final Validation<String> stringMoreThan(int size) {
return GenericValidation.from(s -> ((String) s).length() > size);
};
public static final Validation<String> stringLessThan(int size) {
return GenericValidation.from(s -> ((String) s).length() < size);
};
public static final Validation<String> stringBetween(int morethan, int lessThan) {
return stringMoreThan(morethan).and(stringLessThan(lessThan));
};
public static final Validation<Integer> integerMoreThan(int limit) {
return GenericValidation.from(s -> s > limit);
};
public static final Validation<Integer> integerLessThan(int size) {
return GenericValidation.from(s -> s < size);
};
public static final Validation<Integer> integerBetween(int morethan, int lessThan) {
return integerMoreThan(morethan).and(integerLessThan(lessThan));
};
Это все проверки, поддерживаемые моей платформой на данный момент. То, что я хочу сделать сейчас, - это создать общую проверку c. По сути, я создал этот объект с именем dummy:
public class Dummy {
private String firstName;
private String lastName;
private String email;
private Integer age;
public Dummy() {
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Представьте, что этот объект действителен только в том случае, если имя манекена начинается с S, а фамилия с P и возрастом более 20 В настоящее время у меня нет возможности выполнить эту проверку с моей платформой, я пытался создать эту проверку, но она не работала:
public static final <T> Validation<T> validateObject(Predicate<T> p) {
return GenericValidation.from(p);
}
И использовать тот же метод, который показан ниже:
private static boolean test(Employee e) {
return ValidatorUtil.validateObject(em -> em.getFirstName().startsWith("S") && em.getLastName().startsWith("P") && em.getAge() > 20).test(e);
}
public static void main(String[] args) {
Employee e = new Employee();
e.setAge(123);
e.setEmail("email");
e.setFirstName("firstName");
e.setLastName("lastName");
test(e);
}
Я хочу сделать этот метод абстрактным, потому что я не хочу использовать его только для объекта Dummy, если в будущем я создаю объект Car, я хочу иметь возможность проверять тот же объект car.
Что мне делать?