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

}

}

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

  1. Java内存泄露系列--内存泄露的原因及解决方案(大全)

    原文网址:Java内存泄露系列--内存泄露的原因及解决方案(大全)_IT利刃出鞘的博客-CSDN博客 简介 简介 本文介绍Java中内存泄露的一些原因与解决方案. 如果内存泄露的空间足够大,就会导致内 ...

  2. java.lang.NullPointerException出现的几种原因及解决方案

    java.lang.NullPointerException是java编程中最常见的异常之一.任何使用java的人都有在java程序以及java web应用程序中看到java.lang.NullPoi ...

  3. Java中equals方法造成空指针异常的原因及解决方案

    前言 博主最近在做一个项目的调试工作,期间遇到了一个会导致抛出空指针异常的小问题,说它是小问题,是因为真的只是在写代码的时候注意一下就好了,但是这里还要写一个博客,就是为了剖析这个问题,然后给自己做个 ...

  4. JDK 9中不推荐使用Java的Observer和Observable

    在博客文章< 应用JDK 9 @Deprecated增强功能>中 ,我讨论了JDK 9中 @Deprecated批注中对forRemoval()和since()可选元素(方法)的添加 . ...

  5. JDK 9中已弃用Java的Observer和Observable

    在博客文章< 应用JDK 9 @Deprecated增强功能>中 ,我讨论了JDK 9中 @Deprecated批注中对forRemoval()和since()可选元素(方法)的添加 . ...

  6. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  7. Android Observer与Observable

    更新时间:2022-01-12 在 Android 上使用 Observer 与 Observable. 示例 1)创建被观察者 MyObservable import java.util.Obser ...

  8. java.util.NoSuchElementException错误原因及解决方案

    java.util.NoSuchElementException错误原因及解决方案 参考文章: (1)java.util.NoSuchElementException错误原因及解决方案 (2)http ...

  9. 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案

    学习笔记,仅供参考,有错必纠 文章目录 集合 并发修改异常产生的原因及解决方案 ConcurrentModificationException 解决方案 集合 并发修改异常产生的原因及解决方案 在这个 ...

最新文章

  1. 在闲鱼传疯了,某大厂P8面试题库泄漏!
  2. [Android Pro] ScrollView使用fillViewport设置高度为MatchParent
  3. “习惯性思维”引起的血案
  4. 老广: KVM虚拟化学习笔记
  5. Leetcode 172. 阶乘后的零 解题思路及C++实现
  6. STL源代码分析(ch2 内存分配)jjalloc.h
  7. ORACLE TEXT LEXER PREFERENCE(一)
  8. 如何在SAP云平台上使用MongoDB服务 1
  9. secureCRT及secureFX安装注册和secureFX中出现中文乱码的处理方式
  10. pandas (loc、iloc、ix)的区别
  11. 一个基于verilog的FPGA 的LCD 1602 显示程序
  12. 简明python教程最新版价格_《简明Python教程》【价格 目录 书评 正版】_中国图书网...
  13. 《刘毅突破英文词汇3000》Vocabulary fundamental 分课音频 下载
  14. 关于USB设备芯片型号检测工具
  15. Unity3D引擎各大插件免费下载地址
  16. 170716 网线接口顺序
  17. 『NLP学习笔记』Cross Entropy Loss 的硬截断、软化到 Focal Loss
  18. 抱怨一下项立刚先生和他的飞象网的博客
  19. 中国LINUX公社(论坛)
  20. gradle-6.5-all 快速下载

热门文章

  1. python简单的多人聊天室
  2. 三封信让你知道什么是政治
  3. 35岁程序员:熬夜整理小米Android面试题,系列教学
  4. ORACLE 条件求和 、显示百分比
  5. Fluke DSX-CHA804、DSX-CHA004的区别
  6. 5G推升视频流量 解读5G时代内容产业投资逻辑
  7. 一家传统制造企业的上云之旅,怎样成为了数字化转型典范?
  8. 基于地域和热度的推荐算法,以较为简单的例子来看
  9. MySQL什么用于左连接_简单谈谈mysql左连接内连接
  10. okcc,呼叫中心 怎样搭建呼叫中心系统?