我在新环境中看到了一个代码。它如下:
List results;
if (<Some Condition>) {
results = List<XYZ> results;
} else {
results = List<ABC> results;
}
XYZ
和ABC
是Hibernate实体。
虽然这有效,但我想这不是一种正确的方法。
我想知道什么是更好的方法。我知道没有“完美”的方法来做到这一点。但这可能会更好。
请记住,这些是不相似的实体。所以我认为用接口包装这些实体可能不是一个好主意。
答案 0 :(得分:2)
泛型是一种编译时机制,所以,如果你不知道你要拉的对象类型,那么泛型就不合适了。
我知道实体是不同的,没有相关性,但我不明白为什么界面不是一个好主意。基本上,根据某些条件,您知道要收集一些数据。因此,仅仅因为XYZ和ABC是收集数据类型的候选者,您确实有一些共性。在这种情况下,您可能有一个
List<? extends CommonInterface>
和CommonInterface就在这里使用。
但是,假设XYZ和ABC完全不同,另外一个选项可能是将方法拆分为两部分,并使用通用方法接收您要收集的数据类型:
public void methodForTheCondition() {
if (<some condition>) {
List<XYZ> l = genericMethod(XYZ.class);
// do something
} else {
List<ABC> l = genericMethod(ABC.class);
// do something else, which I assume is different, otherwise opt for
// a common interface
}
}
public <T> List<T> genericMethod(Class<T> clazz) {
List<T> result = new ArrayList<T>();
return result;
}
答案 1 :(得分:1)
但这可能会更好。
是什么让你相信这个?在不知道完全条件的情况下,这看起来就像在一般EntityManager中大量加载项目,因此返回List<X>
X
可能是什么。
从代码的角度来看,没有任何错误,因为您正在创建一个未打字的List并稍后将某个类型的List分配给该变量...
只要您使用List
作为原始类型,就可以为其分配任何列表。这就是为什么设计接口(在不知道完全类型的情况下分配类型...)
请记住,这些是不相似的实体。所以我认为用接口包装这些实体可能不是一个好主意。
有一个很多的接口,可以很好地处理非相似物品。从聚合元素(List,Map)开始,以简单描述共同的一个事物的接口结束,IE:Serializable
,Comparable
等。< / p>
接口并不意味着对象以某种方式相关(即父/抽象类的用途)接口只是说某些功能是实现。(因此,您可以在一个类中继承多个接口)