0

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

  1. 枚举一个类列表,每个类都扩展同一个超类。
  2. 询问班级是否对某个活动感兴趣。
  3. 如果该类感兴趣,则实例化该类并调用对象的事件处理程序。

这个想法是步骤 2 和 3 将阻止不感兴趣的类的实例化。但是,因为我在实例化之前调用了一个方法,所以必须静态地进行检查。Java(正确地)不允许覆盖静态方法,所以看来我必须在步骤 2 中实例化类,使序列看起来像这样:

  1. 枚举一个类列表,每个类都扩展同一个超类。
  2. 实例化每个类并询问对象是否对事件感兴趣。
  3. 如果对象感兴趣,请调用其事件处理程序。如果它不感兴趣,就扔掉它。

我是否错过了完成第一组步骤的一般方法?

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

4

1 回答 1

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.
}
于 2012-11-03T21:50:09.957 回答