Observer和Observable在Java 9标记为废弃。
废弃原因
Observer和Observable有几个原因:
1、不能序列化
Observable没有实现Serializable接口,它的内部成员变量都是私有的,子类不能通过继承它来对Observable的成员变量处理。所以子类也不能序列化。
参考:Why is java.util.Observable class not serializable.
2、不是线程安全
在 java.util.Observable文档里没有强制要求Observable是线程安全的,它允许子类覆盖重写Observable的方法,事件通知无序以及事件通知发生在不同的线程里,这些都是会影响线程安全的问题。
参考:Documentation of java.util.Observable
3、支持事件模型的功能简单
支持事件模型的功能很简单,例如,只是支持事情发生变化的概念,但是不能提供更多哪些内容发生了改变。
参考:deprecate Observer and Observable
解决方案
可以使用java.beans 里的PropertyChangeEvent 和 PropertyChangeListener 来代替目前Observer和Observable的功能。
示例
public class Demo {
private String name;
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);
public Demo() {
this.name= "my name";
}
public String getName() {
return this.name;
}
public void setName(String name) {
String oldValue = this.name;
this.name= name;
//发布监听事件
firePropertyChange("name", oldValue, demoName);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
listeners.removePropertyChangeListener(listener);
}
protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
listeners.firePropertyChange(prop, oldValue, newValue);
}
}
public class Main {
public static void main(String[] args) {
Demo demo= new Demo();
demo.addPropertyChangeListener(new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("OldValue:"+evt.getOldValue());
System.out.println("NewValue:"+evt.getNewValue());
System.out.println("tPropertyName:"+evt.getPropertyName());
}});
demo.setName("new Name");
}
}