我正在尝试使用传递给notifyObservers
方法的对象的属性,但我似乎无法找到访问它们的方法。我只能传入一个字符串,但我希望将更多选项传递给观察者。
这是设置的示例;
public class UpdateInfo {
public String data;
public int debug = 0;
}
public class RXTXComms extends Observable {
UpdateInfo info = new UpdateInfo();
public void sendToBoard(String s) {
.......
UpdateInfo.data = "test";
UpdateInfo.debug = 1;
stChanged();
notifyObservers(info);
}
}
public class Program implements Observer {
public void update(Observable obj, Object arg) {
String msg = ""; // Message to display on GUI
if (arg instanceof UpdateInfo) {
//Print out the message and Debug int onto GUI...but how do I access them from `arg`
}
}
}
如果我将arg
的类型设为UpdateInfo
,那么我会收到编译错误,我的班级Program
不是抽象的....
这不是一个诚实,恰当的问题吗?
答案 0 :(得分:3)
你需要施放课程。
UpdateInfo ui = (UpdateInfo) arg;
<{1>}内的应该可以解决问题。
Java的instanceof
/ Observable
API设计得非常糟糕,请勿使用它。说真的 - 它不应该是一个抽象类,而是一个接口。
观察者模式非常简单,只需自己实现全类型安全。即使指定一个更好的接口版本,它实际上也没有回报。例如,各种Observer
只是Java中此模式的另一个实例,执行得更好:侦听器具有方法名称和额外数据的方法,如果存在,则存在抽象Listener
不止一种方法需要实现,而且通常不需要所有这些方法(参见例如Adapter
)。
所以重新实现具体用例的模式,而不是针对未指定的“如果发生任何事情”的情况。模式实际上意味着重新实现,而不是从模式库中抽象地继承。