如果我有一个对象,我希望能够观察其他几个可观察对象,而不是所有相同类型的对象。例如,我希望A能够观察到B和C.B和C完全不相关,除了它们都实现Observable。在Java中避免instanceof运算符的同时观察多个观测值?
显而易见的解决方案是在update方法中使用“if instanceof”,但很快就会变得混乱,因此我想知道是否有其他方法?
如果我有一个对象,我希望能够观察其他几个可观察对象,而不是所有相同类型的对象。例如,我希望A能够观察到B和C.B和C完全不相关,除了它们都实现Observable。在Java中避免instanceof运算符的同时观察多个观测值?
显而易见的解决方案是在update方法中使用“if instanceof”,但很快就会变得混乱,因此我想知道是否有其他方法?
与以前的建议类似,您可以更改为更新。
public void update(Observable o, Object arg) {
try{
Method update = getClass().getMethod(o.getClass(), Object.class);
update.invoke(this, o, arg);
} catch(Exception e) {
// log exception
}
}
这种方式可以为要观察每个类型添加一个方法
public void update(A a, Object arg);
public void update(B b, Object arg);
public void update(C c, Object arg);
。不幸的是,你需要知道Observable的具体类型。然而,你可以改变反射来允许接口等。
假设对象B/C上的操作是相同的,并且您只是想区分两个对象以实现状态杂耍目的,您还可以创建一个实现实际观察逻辑/状态的委托对象,并使用lookup机制在主要对象中检索特定Observable对象的正确委托。然后转发呼叫。
您的监听器中始终有一个Map<Class<? extends Event>, EventHandler>
。类似的,但没有明确的'instanceof'操作符。它将在地图中替换为containsKey()
。
干净的解决方案是使用(匿名)内部类在A
作为Observer
s。例如:
class A {
public A(B b, C c) {
b.addObserver(new BObserver());
c.addObserver(new CObserver());
}
private class BObserver implements Observer {
// Logic for updates on B in update method
}
private class CObserver implements Observer {
// Logic for updates on C in update method
}
}
这将让你BObserver
/CObserver
实例添加到然而,许多B
S和C
是你真正想要观看。它具有额外的好处,即A
的公共接口不那么混乱,您可以轻松添加新的内部类来处理类D
,E
和F
。
几乎可以肯定你想让你的内部类匿名。 – 2010-12-04 01:20:06