Java新手在这里。这就是我想做的事情:
这个想法是第2步和第3步将阻止不感兴趣的类的实例化。但是,因为我在实例化之前调用了一个方法,所以必须静态地进行检查。 Java(正确地)不允许覆盖静态方法,因此我似乎必须在步骤2中实例化该类,使得序列看起来像这样:
我是否缺少完成第一组步骤的一般方法?
请注意,这个问题主要是理论上的。对象创建开销可能足够低以使其无法实现。不过,我对这些可能性感兴趣。
答案 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.
}