我有一个包含集合的类。我希望能够指定在运行时使用的实现。什么是最好的面向对象的方法来实现这一目标?
public class Klazz {
private class Data {
...
}
private Collection<Data> collection;
public Klazz(?) {
}
}
我怎样才能使构造函数指定用于实现Klazz的集合类型。
答案 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不会大量限制集合的属性,并且对于列表,集合或“包”的集合同样有效的用例是......不寻常。