在实例化子类之前检查子类的相关性?

时间:2012-11-03 21:31:36

标签: java static superclass

Java新手在这里。这就是我想做的事情:

  1. 枚举一个类列表,每个类都扩展了相同的超类。
  2. 询问班级是否对某项活动感兴趣。
  3. 如果该类感兴趣,请实例化该类并调用该对象的事件处理程序。
  4. 这个想法是第2步和第3步将阻止不感兴趣的类的实例化。但是,因为我在实例化之前调用了一个方法,所以必须静态地进行检查。 Java(正确地)不允许覆盖静态方法,因此我似乎必须在步骤2中实例化该类,使得序列看起来像这样:

    1. 枚举一个类列表,每个类都扩展了相同的超类。
    2. 实例化每个类并询问对象是否对该事件感兴趣。
    3. 如果对象感兴趣,请调用其事件处理程序。如果它不感兴趣,扔掉它。
    4. 我是否缺少完成第一组步骤的一般方法?

      请注意,这个问题主要是理论上的。对象创建开销可能足够低以使其无法实现。不过,我对这些可能性感兴趣。

1 个答案:

答案 0 :(得分:1)

由于我们谈论的是理论,我指的是一些事实,并在设计方面发言。

静态方法与类的特定实例无关,因此覆盖不是一个选项,因为它依赖于具有实例。我在谈论Java,因为我记得其他一些允许类方法覆盖的语言。

解决方法是在每个子类中定义一个静态方法,返回它感兴趣的事件,这样你就可以在实例化之前知道这些数据。

另一种选择是让一个特定的类负责这些对象的实例化,并使该类保持一个表,将事件与感兴趣的类列表(您可以初始化和配置的表)相关联。这种方法似乎更易于维护,因为如果要从事件中取消订阅类,则不必更改代码。

最后,您只需实例化与某个事件关联的所有类:

public class EventClassCreator {
    private Map<String, List<String>> subscriptions;

    public EventClassCreator() {
        subscriptions = new HashMap<String,Set<String>>();
    }

    public void addSubscription(String event, String class) {
        if(subscriptions.containsKey(event))
            subscriptions.get(event).add(class);
        else {
            Set<String> subscriptionsForEvent = new HashSet<String>();
            subscriptionsForEvent.add(class);
            subscriptions.put(event, subscriptionsForEvent);
        }
    }

    //You just need to make an event that loops over the list of classes, 
    //checks a subscription and instantiates a class if it is in the 
    //proper list.
}