Создание структуры проверки с использованием java 8 - PullRequest
0 голосов
/ 01 февраля 2020

Я разрабатываю платформу псевдо-проверки в 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.

Что мне делать?

...