Я пытаюсь создать класс валидатор с несколькими простыми правилами проверки. Эти правила могут применяться одинаково к разным типам Hibernate entity (или DTO), и я хотел бы унифицировать этот класс без создания разных реализаций.
Я пытаюсь сделать это с помощью дженериков, но проблема в том, что, хотя каждый тип валидируемого объекта имеет определенный геттер (getCatalog), я не могу вызвать его с помощью дженериков не реализуя общий интерфейс или не расширяя абстрактный класс. Я думаю, что интерфейс для entity / dto в таком случае не является хорошим выбором, хотя может я и не прав и интерфейс типа Cataloged или HasCatalog допустим для таких целей..
Validator class
public class Validator<T> {
public boolean validate(List<T> objects, Function<T, Catalog> catalogGetter) {
if (CollectionUtils.isEmpty(objects)) {
return false;
}
if (differentCatalogsInLoadExist(objects, catalogGetter)) {
return false;
}
if (catalogForObjectNotExists(objects, catalogGetter)) {
return false;
}
return true;
}
private boolean differentCatalogsInLoadExist(List<T> objects, Function<T, Catalog> catalogGetter) {
return objects.stream()
.map(catalogGetter)
.map(catalog -> catalog.getCatalogCode())
.distinct()
.count() > 1;
}
private boolean catalogForObjectNotExists(List<T> objects, Function<T, Catalog> catalogGetter) {
return objects.stream()
.map(catalogGetter)
.findFirst()
.isEmpty();
}
}
Основная моя цель - избавиться от этого
Function<T, Catalog> catalogGetter
Может есть более красивый способ или вариант с интерфейсом тут допустим?