Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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_Interface - Fatal编程技术网

Java 实现特定接口的所有类的对象的集合

Java 实现特定接口的所有类的对象的集合,java,interface,Java,Interface,我有一个接口TestInterface,不同的类可以实现该接口。是否可以拥有实现接口的所有对象的集合?可以使用创建集合 LinkedList<TestInterface> store LinkedList存储 其中store是集合的名称。但是如何跟踪实现TestInterface的类的对象创建。此外,收藏地点在哪里?不知道你想要这个做什么,很难说 但是无论如何,您可以创建一个集合,但是为了跟踪和存储对TestInterface对象的引用,您必须控制它们的创建 最简单的方法是使用T

我有一个接口TestInterface,不同的类可以实现该接口。是否可以拥有实现接口的所有对象的集合?可以使用创建集合

LinkedList<TestInterface> store
LinkedList存储

其中store是集合的名称。但是如何跟踪实现TestInterface的类的对象创建。此外,收藏地点在哪里?

不知道你想要这个做什么,很难说

但是无论如何,您可以创建一个集合,但是为了跟踪和存储对
TestInterface
对象的引用,您必须控制它们的创建

最简单的方法是使用
TestInterfaceFactory
(请参见模式),这也是保存
存储
集合和实例引用的好地方

是否可以拥有实现接口的所有对象的集合

理论上是的

实际上,只有当创建对象实例的所有内容都将其添加到列表中时,它才会起作用。这可能使它不切实际。。。除非更改对象的创建方式

  • 一种方法使用工厂,但如果不使用精心实现的工厂,就无法阻止某些代码创建实例

  • 另一种方法是用抽象基类替换接口,其构造函数保证将每个新实例添加到列表中。这不能用普通代码来破坏。但是,如果使用Java对象序列化(或类似),则需要在基类中添加一个“钩子”,以确保将反序列化对象添加到列表中



请注意,包含某个接口或类的所有实例的集合可能存在巨大的内存泄漏。你可能需要对此做些什么;e、 g.使用弱引用

如果您迫切需要将其自动化,那么原则上,您可以:

  • 使用Java instrumentation框架,添加ClassFileTransformer,以确保实现接口的任何类都被重新定义,使其构造函数自动将实例添加到集合中(如果要遵循此路线,请查看字节码工程库BCEL之类的内容)
  • 可能更容易,但仍然需要大量的工作:使用JVM工具接口编写一个代理,可以动态查询堆中的对象实例

无论哪种方式,如果接口是您的,那么引入编程约定,将该接口的所有实现实例添加到集合中肯定会更容易,即使更容易出错。

可能的重复:我有一个名为students的类和一个名为士兵的类。这两个类都实现了电话接口,即学生和士兵都可以使用电话进行通信。将来我还可以创建其他类,如医生、工程师,这些类也可以实现电话接口或其他接口,如互联网。使用电话的人只能与使用电话的人通信。类似于互联网。问题是:当我创建“学生”对象或“医生”对象时,我可以轻松创建并将它们添加到各自类中各自的集合中。但如何跟踪所有使用电话的人…因为否则我无法使用电话与其他实体进行通信。只有医生才能与医生交流,学生才能与学生交流……但我希望那些使用手机的人能够彼此交流,而不管对方是什么……@aps-我想我的答案涵盖了这一点。没有理由要求列表是特定于类的。