java - 过滤继承对象的集合

标签 java oop inheritance collections

我有一个基类

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 类还包含允许:

  1. 查询它持有什么样的具体事物,例如

    public Set<Class<? extends AbstractThing>> containsTypes();

  2. 获取特定具体类型的事物的子集,例如

    public <S extends AbstractMeasurement> Set<S> getSubset(Class<S> type);

此刻我的ThingCollector实现包含类型为 Set<AbstractThing> 的私有(private)字段. add(...)方法将所有内容添加到同一个 Set 对象。 containsTypes()getSubset(...)方法在迭代 Set 时使用反射编织它们的魔力。

这行得通,但看起来很乱。我相信一定有更好的方法!

您能否建议我构建解决方案的其他方法?我确实考虑过 ThingCollector为扩展 AbstractThing 的每个单独类型维护一个单独的 Set ,但是:

  1. 这意味着 ThingCollector可能包含许多 Set 对象。在大多数用例中,几乎所有这些集合都是空的。即使有几十个 Things 继承自 AbstractThing ,在实践中,任何给定的 ThingCollector 中只会包含几种不同类型的事物.

  2. 也很乱;每次我在 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/

相关文章:

c# - 这是哪种关系,一侧是一对一,另一侧是多对一

java - 在颜色数组中转换随机颜色

java - 封装的目的是什么?它提供安全层吗?

c# - 继承对象的容器

Java 验证字符串方程

java - 将任务从 EDT 分派(dispatch)到 main?

c# - 类继承/方法覆盖

java - 哪些成员不在子类中继承?

java - 如何在 Java 8 上使用 LocalDateTime.now() 获取当前的 LocalDateTime,包括秒数

java - 在哪里放置检查图中两条边是否平行的方法?