我正在尝试使用几个简单的验证规则设计一个类。这些规则可以应用于不同的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
,因为它看起来并不尽如人意。
答案 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的新闻,我都找不到它们。很高兴听到有人知道的话。