具有针对不同类型对象的相同验证规则的Java设计类

时间:2020-03-21 00:30:15

标签: java oop generics design-patterns

我正在尝试使用几个简单的验证规则设计一个类。这些规则可以应用于不同的Hibernate实体(或DTO),我想在不创建不同实现的情况下统一此类。

我尝试通过使用泛型来执行此操作,但是问题是,尽管每种经过验证的对象类型都有特定的getter(getCatalog),但如果不实现通用接口或扩展抽象类,就不能使用泛型来调用它。我认为在这种情况下,实体/ dto的接口不是一个好选择。

Validator类

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,因为它看起来并不尽如人意。

1 个答案:

答案 0 :(得分:0)

不幸的是,到目前为止,我只能通过反射来做到这一点,通常是通过诸如Apache PropertyUtils之类的助手进行的:

Catalog c=(Catalog)PropertyUtils.getProperty(myObj, "catalog");
// Where myObj is some object  that has "getCatalog()"

AFAIK是一个折衷方案:反射功能强大,但跳过了许多编译时检查,这与Java最初的强类型传统背道而驰;您提出的替代方案(接口或对MyClass :: getCatalog的显式引用)是防错的,但很冗长,并且在可能接受新的未知bean类的框架中也造成了问题。

如果有任何有关Java 14的新闻,我都找不到它们。很高兴听到有人知道的话。

相关问题