【发布时间】:2008-12-16 08:17:25
【问题描述】:
我有一个触发自定义 java 事件的 java 类。代码结构如下:
public class AEvent extends EventObject {
...
}
public interface AListener extends EventListener {
public void event1(AEvent event);
}
public class A {
public synchronized void addAListener(AListener l) {
..
}
public synchronized void removeAListener(AListener l) {
..
}
protected void fireAListenerEvent1(AEvent event) {
..
}
}
一切正常,但我想创建一个新的 A 子类(称为 B),它可能会触发一个新事件。我正在考虑以下修改:
public class BEvent extends AEvent {
...
}
public interface BListener extends AListener {
public void event2(BEvent event);
}
public class B extends A {
public synchronized void addBListener(BListener l) {
..
}
public synchronized void removeBListener(BListener l) {
..
}
protected void fireBListenerEvent2(AEvent event) {
..
}
}
这是正确的方法吗?我在网上搜索示例,但找不到任何示例。
在这个解决方案中有一些我不喜欢的地方:
-
BListener有两种方法,一种使用AEvent,另一种使用BEvent作为参数。 -
B类都有addAListener和addBListener方法。我应该用 private 关键字隐藏 addAListener 吗? [更新:无法使用 private 关键字隐藏] -
fireAListenerEvent1和fireBListenerEvent1方法存在类似问题。
我使用的是 Java 1.5 版。
【问题讨论】:
-
您能否详细介绍一下您的设计动机?为什么B扩展A很重要,在什么样的情况下会使用这些东西?否则 uzhin 的方法似乎指向了正确的方向。
-
B 向 A 类添加了新功能。这意味着 A 触发的事件 (event1) 对 B 类是有效事件。由于新功能,新事件 (event2) 对类也有效B. 我想一起处理这两个事件(event1+event2),因为它们是相关的。
-
旁注:在 fireXXX 方法中可能会发生 ConcurrentModificationException,除非您也同步这些方法(昂贵!)。对于典型用例,将 java.util.concurrent.CopyOnWriteArrayList 用于侦听器列表会更快且更不容易出错,这样就不需要同步了。
标签: java inheritance events listener