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

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

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");  
  }  
}

版权声明:著作权归作者所有。

相关推荐

ProgressDialog(deprecated )替代方案

ProgressDialog在API level 26被废弃,官方的解释是ProgressDialog是一个模态框(modal dialog),它会禁止与app的交互。可以在App的UI里嵌入ProgressBar作为它的替代方案。如果想实现模态框,也可以在AlertDialog里嵌入ProgressBar来实现。

配置Eclipse使用Java9

Oxygen 4.7.1aEclipse Oxygen 4.7.1a已经支持Java 9启动,以及支持Java 9的开发,直接安装Eclipse Oxygen 4.7.1a即可,不需要特别的配置。但运行可能会出现一些环境问题,也可以按以下配置eclipse.ini指定Java 9的vm-vm C:\Program&nb

Java 9:改进的Try-With-Resources

Java 7之前在Java 7之前,在使用一些资源的类时,如BufferedReader,我们要常常提醒自己,必须要在finally块关闭资源。Java 6示例BufferedReader br = null; try {   br = new BufferedReader(ne

Java重写hashCode()的原则及方法

Java重写hashCode()方法有几个原则:1、如果两个对象使用equals()方法比较,返回true(即相等),那么两个比较对象返回的hashCode()必须相等。System.out.println(objA.equals(objB)); System.out.printlin(objA.hashCode() == objB.hashCode()); 如果objA.eq

Java 9 Stream新增方法takeWhile的bug

Java 9的Stream新增方法takeWile():允许我们返回Stream里满足条件的前面部分元素。如:String[] arr= {"a", "b", "c","d"}; Arrays.stream(arr)     &n

Java 9的Process和ProcessHandler

Java 9给Process API引入了多种改进,其中新增了ProcessHandler类,它提供了进程相关的信息,如pid,父进程,子进程,进程开始时间以及累计cpu时间等。这里使用Java 9的jshell简单演示下Process的使用:jshell> Process p = new ProcessBuil

Java 10 var的使用及限制

在Java 10的众多特性里,局部变量的类型推断是比较受大家关注的特性之一。这里简单介绍下它的使用以及限制。在Java 7,声明一个列表我们会这样做:List<String> list = new ArrayList<String>(); Java 8/9可以改写为:List<String>&

Java 9数组转换为List

Java 9使用List.of在Java 9,List新增了of()的工厂方法用来产生不可变的列表。返回一个空列表List list = List.of(); 多个元素生成列表List<Integer> list = List.of(1,2,3,4,5); 数组转换为列表Integer[] arr