指定Java中使用的集合类型

时间:2017-10-15 04:27:24

标签: java oop collections

我有一个包含集合的类。我希望能够指定在运行时使用的实现。什么是最好的面向对象的方法来实现这一目标?

public class Klazz {
    private class Data {
        ...
    }


    private Collection<Data> collection;

    public Klazz(?) {
    }
}

我怎样才能使构造函数指定用于实现Klazz的集合类型。

2 个答案:

答案 0 :(得分:3)

在Java中,List,Set和Queue接口派生自java.util.Collection接口。因此,List,Set和Queue的任何实现的所有对象都可以由Collection引用引用。

有关详细说明,请参阅geeksforgeeks

上的这本非常好的指南

tl;博士,你可以这样做:

public class Klazz {
  private class Data {
    ...
  }


  private Collection<Data> collection;

  public Klazz(Collection<Data> collection) {
    this.collection = collection;
  }

  public static void main(String[] args) {
    Klazz k1 = new Klazz(new ArrayList<>());
    Klazz k2 = new Klazz(new HashSet<>());
  }
}

答案 1 :(得分:3)

允许Java客户端选择实现类的经典方法是使用客户端提供的Factory对象来实例化对象。

这样的事情:

public interface CollectionFactory {
   <T> Collection<T> create();
}

public class Klazz {
    private Collection<Data> collection;

    public Klazz(CollectionFactory <Data> factory) {
        collection = factory.create();
    }
}

(我没有用编译器检查上面的内容,所以可能有拼写错误等)

传入集合对象是另一种解决方案。可能存在抽象泄漏,但如果工厂“棘手”,工厂对象也是如此。

也可以传递Class对象并使用反射来实例化集合。

@Tim Biegeleisen虽然有一点意见。 Collection API不会大量限制集合的属性,并且对于列表,集合或“包”的集合同样有效的用例是......不寻常。