我有一个基类
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>
的私有(private)字段. add(...)
方法将所有内容添加到同一个 Set 对象。 containsTypes()
和 getSubset(...)
方法在迭代 Set 时使用反射编织它们的魔力。
这行得通,但看起来很乱。我相信一定有更好的方法!
您能否建议我构建解决方案的其他方法?我确实考虑过 ThingCollector
为扩展 AbstractThing
的每个单独类型维护一个单独的 Set ,但是:
这意味着
ThingCollector
可能包含许多 Set 对象。在大多数用例中,几乎所有这些集合都是空的。即使有几十个 Things 继承自AbstractThing
,在实践中,任何给定的ThingCollector
中只会包含几种不同类型的事物.也很乱;每次我在
ThingCollector
中定义另一个 Set ,我还需要添加新方法add(ThingZ t)
和getThingZSubset()
.
有没有更好的方法? 是否有设计模式或不同的类组织可以帮助我?我不依赖上面的接口(interface)来查询和子集 ThingCollector
的内容- 考虑所有建议!
最佳答案
使用 Map<Class,Set>
怎么样?如下:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ThingCollector {
Map<Class,Set> map = new HashMap<Class,Set>();
public void add( AbstractThing newThing )
{
Class clazz = newThing.getClass();
Set set = map.get( clazz );
if ( set == null )
{
set = new HashSet();
map.put( clazz, set );
}
set.add( newThing );
}
public <S extends AbstractThing> Set<S> getSubset( Class<S> type )
{
return map.get( type );
}
}
使用 Guava 的奖励积分多 map 让您的生活更轻松。
关于java - 过滤继承对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9833920/