列出使用情况而不指定类型

时间:2014-08-04 21:49:52

标签: java hibernate list generics entities

我在新环境中看到了一个代码。它如下:

List results;

if (<Some Condition>) {
    results = List<XYZ> results;
} else {
    results = List<ABC> results;
}

XYZABC是Hibernate实体。 虽然这有效,但我想这不是一种正确的方法。

我想知道什么是更好的方法。我知道没有“完美”的方法来做到这一点。但这可能会更好。

请记住,这些是不相似的实体。所以我认为用接口包装这些实体可能不是一个好主意。

2 个答案:

答案 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:SerializableComparable等。< / p>

接口并不意味着对象以某种方式相关(即父/抽象类的用途)接口只是说某些功能是实现。(因此,您可以在一个类中继承多个接口)