java observable_Java 9:Observer和Observable废弃原因及解决方案

Observer和Observable在Java 9标记为废弃。

废弃原因

Observer和Observable有几个原因:

1、不能序列化

Observable没有实现Serializable接口,它的内部成员变量都是私有的,子类不能通过继承它来对Observable的成员变量处理。所以子类也不能序列化。

2、不是线程安全

在 java.util.Observable文档里没有强制要求Observable是线程安全的,它允许子类覆盖重写Observable的方法,事件通知无序以及事件通知发生在不同的线程里,这些都是会影响线程安全的问题。

3、支持事件模型的功能简单

支持事件模型的功能很简单,例如,只是支持事情发生变化的概念,但是不能提供更多哪些内容发生了改变。

解决方案

可以使用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");

}

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值