如何正确的使用Java事件通知(1)

通过实现观察者模式来提供 Java 事件通知(Java event notification)似乎不是件什么难事儿,但这过程中也很容易就掉进一些陷阱。本文介绍了我自己在各种情形下,不小心制造的一些常见错误。

Java 事件通知

让我们从一个最简单的 Java Bean 开始,它叫StateHolder,里面封装了一个私有的 int 型属性 state 和常见的访问方法:

publicclassStateHolder {

privateintstate;

publicintgetState() {

returnstate;

}

publicvoidsetState(intstate ) {

this.state = state;

}

}

现在假设我们决定要 Java bean 给已注册的观察者广播一条 状态已改变 事件。小菜一碟!!!定义一个最简单的事件和监听器简直撸起袖子就来……

// change event to broadcast

publicclassStateEvent {

publicfinalintoldState;

publicfinalintnewState;

StateEvent( intoldState,intnewState ) {

this.oldState = oldState;

this.newState = newState;

}

}

// observer interface

publicinterfaceStateListener {

voidstateChanged( StateEvent event );

}

接下来,我们需要在 StateHolder 的实例里注册 StatListeners。

publicclassStateHolder {

privatefinalSet listeners =newHashSet<>();

[...]

publicvoidaddStateListener( StateListener listener ) {

listeners.add( listener );

}

publicvoidremoveStateListener( StateListener listener ) {

listeners.remove( listener );

}

}

最后一个要点,需要调整一下StateHolder#setState这个方法,来确保每次状态有变时发出的通知,都代表这个状态真的相对于上次产生变化了:

publicvoidsetState(intstate ) {

intoldState =this.state;

this.state = state;

if( oldState != state ) {

broadcast( newStateEvent( oldState, state ) );

}

}

privatevoidbroadcast( StateEvent stateEvent ) {

for( StateListener listener : listeners ) {

listener.stateChanged( stateEvent );

}

}

搞定了!要的就是这些。为了显得专(zhuang)业(bi)一点,我们可能还甚至为此实现了测试驱动,并为严密的代码覆盖率和那根表示测试通过的小绿条而洋洋自得。而且不管怎么样,这不就是我从网上那些教程里面学来的写法吗?

那么问题来了:这个解决办法是有缺陷的……

java 简单事件的使用,如何正确的使用Java事件通知(1)相关推荐

  1. java核心面试_不正确的核心Java面试答案

    java核心面试 总览 在Internet上,Java面试问题和答案从一个网站复制到另一个网站. 这可能意味着错误或过时的答案可能永远不会得到纠正. 这是一些不太正确或已经过时的问题和答案. 即是Ja ...

  2. java比较时间sql_如何正确比较日期 java.sql.Date

    import java.sql.Date; ..... .... ... .. . 例如今天是2010-12-2 Date d1 = new Date(System.currentTimeMili() ...

  3. 【转】Java中获取文件大小的正确方法

    [转]Java中获取文件大小的正确方法 本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明.由于本人不定期会整理相关 ...

  4. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试

    文章目录 1.安装jdk配置环境 2.cmd命令行测试环境变量配置是否正确及运行java程序 3.安装IDEA编写代码测试 1.安装jdk配置环境 首先打开官网Oracle https://www.o ...

  5. 在JAVA语言程序中main_在Java程序main方法中,正确的参数是

    [单选题]下列叙述中,错误的是 [填空题]Access属于()数据库,Access中,不允许在主关键字字段中有重复值或(). [单选题]如下哪些字符串是Java中的标识符? [填空题]常用的基本电量传 ...

  6. 不允许使用java方式启动_细品 Java 中启动线程的正确和错误方式

    细品 Java 中启动线程的正确和错误方式 前文回顾详细分析 Java 中实现多线程的方法有几种?(从本质上出发) start 方法和 run 方法的比较 代码演示:/** * * start() 和 ...

  7. java 事件通知_正确获取Java事件通知

    java 事件通知 实现观察者模式以提供Java事件通知似乎是一件容易的事. 但是,容易陷入一些陷阱. 这是我在各种场合不慎造成的常见错误的解释-- Java事件通知 让我们从一个简单的bean St ...

  8. 正确获取Java事件通知

    实现观察者模式以提供Java事件通知似乎是一件容易的事. 但是,容易陷入一些陷阱. 这是我在各种场合不慎造成的常见错误的解释-- Java事件通知 让我们从一个简单的bean StateHolder开 ...

  9. 正确地kill java历程

    正确地kill java历程 www.MyException.Cn   发布于:2012-06-27 14:20:08   浏览:4次 正确地kill java进程 在linux/unix下,你会怎么 ...

最新文章

  1. 各浏览器抗uaf机制
  2. Using the Cordova Camera API
  3. .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
  4. class传参 python_Python类的概念、定义、属性、继承
  5. Ubuntu Sublime Text 3 搜狗拼音
  6. c#winform演练 ktv项目 点击歌单行 可以播放对应的歌曲
  7. TypeError: Cannot read property ‘publish‘ of undefined“报错问题解决
  8. Exchange服务器系列课程之二--Exchange Server 2003多服务器安装以及管理工具介绍
  9. Spatial Transformer Networks
  10. python爬虫xpath提取数据_python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)...
  11. iOS 利用UIPresentationController自定义转场动画
  12. 如何配置Mysql驱动
  13. 采用邻接表表示法创建无向图
  14. 国外计算机从什么开始学,从零开始学电脑知识 1(国外英语资料).doc
  15. Uefi ABL读取XBL设置的标志位
  16. 罗杨美慧 20180912-3 词频统计
  17. 网络协议分析(某国外社交软件)
  18. fdtd simulation, plotting with gnuplot, writting in perl
  19. 基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB
  20. 钢管切割下料--python

热门文章

  1. Develop内部函数,持续更新
  2. matlab常用工具箱的调用指令
  3. elementui el-from 怎样显示图片_vue2.0使用weui.js的uploader组件上传图片(兼容移动端)...
  4. php输入对话框,如何使用JavaScript实现输入对话框
  5. java的自增自减_Java中自增和自减操作符(++/--)的那些事
  6. [Vue]组件——通过$emit为组件自定义事件
  7. 第二章:用户登录管理模块
  8. python2 openpyxl 复制excel内容到新的excel文件中 告警问题
  9. Axure原型制作规范
  10. 数据契约(DataContract)