Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指定Java中使用的集合类型_Java_Oop_Collections - Fatal编程技术网

指定Java中使用的集合类型

指定Java中使用的集合类型,java,oop,collections,Java,Oop,Collections,我有一个包含集合的类。我希望能够指定在运行时使用的实现。实现这一点的最佳面向对象方法是什么 public class Klazz { private class Data { ... } private Collection<Data> collection; public Klazz(?) { } } 如何使构造函数指定用于实现Klazz的集合类型。在Java中,列表、集合和队列接口是从Java.util.collec

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

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


    private Collection<Data> collection;

    public Klazz(?) {
    }
}

如何使构造函数指定用于实现Klazz的集合类型。

在Java中,列表、集合和队列接口是从Java.util.collection接口派生的。因此,集合引用可以引用列表、集合和队列的任何实现的所有对象

有关详细说明,请参阅以下网站的《非常好的指南》

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<>());
  }
}

在Java中,列表、集合和队列接口派生自Java.util.Collection接口。因此,集合引用可以引用列表、集合和队列的任何实现的所有对象

有关详细说明,请参阅以下网站的《非常好的指南》

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<>());
  }
}

允许Java客户机选择实现类的经典方法是使用客户机提供的工厂对象来实例化该对象

大概是这样的:

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

public class Klazz {
    private Collection<Data> collection;

    public Klazz(CollectionFactory <Data> factory) {
        collection = factory.create();
    }
}
我还没有和编译器核对过上面的内容,所以可能会有打字错误等

传递集合对象是另一种解决方案。存在潜在的抽象泄漏,但如果工厂很棘手,那么工厂对象也是如此

还可以传递类对象并使用反射来实例化集合


@蒂姆·比格莱森说得有道理。Collection API对集合的属性没有太多的约束,对于列表、集合或包等集合同样有效的用例是。。。。不同寻常。

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

大概是这样的:

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

public class Klazz {
    private Collection<Data> collection;

    public Klazz(CollectionFactory <Data> factory) {
        collection = factory.create();
    }
}
我还没有和编译器核对过上面的内容,所以可能会有打字错误等

传递集合对象是另一种解决方案。存在潜在的抽象泄漏,但如果工厂很棘手,那么工厂对象也是如此

还可以传递类对象并使用反射来实例化集合


@蒂姆·比格莱森说得有道理。Collection API对集合的属性没有太多的约束,对于列表、集合或包等集合同样有效的用例是。。。。不同寻常。

也许您可以详细说明为什么需要不同类型的集合来在内部实现类。不同的集合为添加元素、删除元素和搜索提供了不同的计算复杂性。我希望客户端能够根据自己的需要选择所需的实现。这种方法的问题是,不同的集合具有不同的接口来存储和检索数据。如果保存为泛型集合,则只能使用集合通用的方法。那么,我应该如何实现允许客户端选择的目标?我建议编辑您的问题,并告诉我们此类应该如何处理其数据。通过说你们的类可以使用任何集合,你们告诉我们消费者可以使用地图、集合或列表。这对您的想法有意义吗?也许您可以详细说明为什么需要不同类型的集合在内部实现类。不同的集合为添加元素、删除元素和搜索提供不同的计算复杂性。我希望客户端能够根据自己的需要选择所需的实现。这种方法的问题是,不同的集合具有不同的接口来存储和检索数据。如果保存为泛型集合,则只能使用集合通用的方法。那么,我应该如何实现允许客户端选择的目标?我建议编辑您的问题,并告诉我们此类应该如何处理其数据。通过说你们的类可以使用任何集合,你们告诉我们消费者可以使用地图、集合或列表。这对你的想法有意义吗?这是如何解决集合和列表是非常不同的集合类型的问题的?完美:-。客户提供不同的工厂以生成不同类型的集合。如果希望Klazz代码对不同的集合类型有不同的行为,那么它可以对工厂创建的集合对象执行instanceof测试?这使得该方法不安全,不必要地难以实现。@StephenC只返回集合。或者用供应商替换整个工厂谢谢。。。我已经更新了我的答案,以解决您的所有问题,这是如何绕过集合和列表是非常不同的集合类型的问题的呢。客户提供不同的工厂生产不同的产品
收藏。如果希望Klazz代码对不同的集合类型有不同的行为,那么它可以对工厂创建的集合对象执行instanceof测试?这使得该方法不安全,不必要地难以实现。@StephenC只返回集合。或者用供应商替换整个工厂谢谢。。。我已更新了我的答案,以解决您的所有问题,