【发布时间】:2012-03-23 03:45:13
【问题描述】:
我有一个基类
public abstract AbstractThing { };
还有很多继承自它的类
public ThingA extends AbstractThing { };
public ThingB extends AbstractThing { };
...
public ThingY extends AbstractThing { };
我有一个 ThingCollector 对象,其中包含一组 Thing 对象,即:
public class ThingCollector {
public void add(AbstractThing newThing);
}
ThingCollector 类还包含允许:
-
查询它持有什么样的具体事物,例如
public Set<Class<? extends AbstractThing>> containsTypes(); -
获取特定具体类型的事物的子集,例如
public <S extends AbstractMeasurement> Set<S> getSubset(Class<S> type);
目前我的ThingCollector 实现包含Set<AbstractThing> 类型的私有字段。 add(...) 方法将所有内容添加到同一个 Set 对象中。 containsTypes() 和 getSubset(...) 方法在迭代 Set 时使用反射来编织它们的魔力。
这行得通,但看起来很乱。我相信一定有更好的方法!
您能否建议我构建解决方案的其他方法? 我确实考虑让 ThingCollector 为扩展 AbstractThing 的每个单独类型维护一个单独的 Set,但是:
这意味着
ThingCollector可能包含数十个 Set 对象。在大多数用例中,几乎所有这些集合都是空的。尽管有几十个事物继承自AbstractThing,但实际上任何给定的ThingCollector中只会包含几种不同类型的事物。也很乱;每次我在
ThingCollector中定义另一个Set 时,我还需要添加新方法add(ThingZ t)和getThingZSubset()。
有没有更好的方法? 这里是否有设计模式或不同的类组织可以帮助我?我不依赖上面的接口来查询和子集ThingCollector 的内容 - 所有建议都考虑了!
【问题讨论】:
-
我还应该补充...虽然 3rd 方库(如建议的番石榴)确实存在,但我想避免在这种情况下使用它们。
-
你应该展示你的实现代码 - “使用反射编织他们的魔法”不足以让我们知道可以改进的地方。
标签: java oop inheritance collections