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

时间:2011-06-25 03:39:12

标签: java interface

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

创建集合
LinkedList<TestInterface> store

其中store是集合的名称。但是如何跟踪实现TestInterface的类的对象创建。还有哪里可以保留收藏品?

3 个答案:

答案 0 :(得分:0)

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

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

最简单的方法是使用TestInterfaceFactory(请参阅AbstractFactory模式),这也是使store集合与实例引用保持一致的好地方。

答案 1 :(得分:0)

  

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

理论上是的。

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

  • 一种方法是使用工厂,但是如果不使用经过精心设计的工厂,就没有什么可以阻止某些代码创建实例。

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


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

答案 2 :(得分:0)

如果您迫切需要自动进行此操作,那么在原则中,您可以:

  • 使用Java检测框架,添加一个ClassFileTransformer,以确保重新定义实现您的接口的任何类,使其构造函数自动将实例添加到您的集合中(如果您要下载,请查看类似于Bytecode工程库,BCEL的内容)这条路线);
  • 可能更容易但仍然需要做很多工作:使用JVM工具接口编写一个代理,可以动态查询堆中的对象实例。

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