博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java匿名内部类与回调函数
阅读量:5814 次
发布时间:2019-06-18

本文共 3037 字,大约阅读时间需要 10 分钟。

    之所以将匿名内部类和回调函数两个知识点一起写,是因为最近学习zookeeper的时候正好遇到这么一个例子。详细内容请参考:https://www.w3cschool.cn/zookeeper/zookeeper_api.html

以下是与ZooKeeper集合连接的完整代码。

public class ZooKeeperConnection {   // declare zookeeper instance to access ZooKeeper ensemble   private ZooKeeper zoo;   final CountDownLatch connectedSignal = new CountDownLatch(1);   // Method to connect zookeeper ensemble.   public ZooKeeper connect(String host) throws IOException,InterruptedException {	      zoo = new ZooKeeper(host,5000,new Watcher() {		         public void process(WatchedEvent we) {            if (we.getState() == KeeperState.SyncConnected) {               connectedSignal.countDown();            }         }      });		      connectedSignal.await();      return zoo;   }   // Method to disconnect from zookeeper server   public void close() throws InterruptedException {      zoo.close();   }}

匿名内部类的创建格式如下:

new 父类构造器(参数列表)|实现接口()      {       //匿名内部类的类体部分      }

在上面的代码中,connect方法中在实例化ZooKeeper对象时用到了匿名内部类:

zoo = new ZooKeeper(host,5000,new Watcher() {		         public void process(WatchedEvent we) {            if (we.getState() == KeeperState.SyncConnected) {               connectedSignal.countDown();            }         }      });

这个内部类没有自己的名字,而是用到了Watcher接口,而通常情况下接口是不能用new的,但是在匿名内部类中可以这样。匿名内部类的类体是一个名为process的方法,这个方法就是用来实现Watcher接口中定义的process抽象方法的。

在这个匿名内部类中恰好又运用了回调函数(又叫回调方法)。

回调是一种常见的程序设计模式。在这种模式中,可以指出某个特定事件发生时应该采取的动作。
ZooKeeper类通过其构造函数提供connect功能。构造函数的签名如下 : ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
在上面的类ZooKeeperConnection中,connect 方法创建一个ZooKeeper对象,连接到ZooKeeper集合,然后返回对象。
在此处使用CountDownLatch,就是为了形成一个回调函数。一开始将CountDownLatch对象connectedSignal值设为CountDownLatch(1);如果匿名内部类中的if语句不为真,这意味着下面的主线程会在一直处于等待状态,停留在connectedSignal.await();处。这个就恰好符合了回调函数的意义:
在某个特定事件发生时应该采取的动作。
如果客户端与Zookeeper没有成功建立连接(也就是if语句不为真),就不返回ZooKeeper对象zoo(在
connectedSignal.await()停留)。而一旦成功建立连接
(也就是if语句为真,执行connectedSignal.countDown()),就返回
ZooKeeper对象zoo
(
connectedSignal.await()放行)
将匿名内部类改为普通类
在上述代码中可以将匿名内部类拆出来,作为一个单独类:XyzWatcher
public class XyzWatcher implements Watcher {    @Override    public void process(WatchedEvent watchedEvent) {        final CountDownLatch connectedSignal = new CountDownLatch(1);        if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {            connectedSignal.countDown();        }        try {            connectedSignal.await();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
原来的类ZooKeeperConnection改为如下:
public class ZooKeeperConnection {    // declare zookeeper instance to access ZooKeeper ensemble    private ZooKeeper zoo;    //public final CountDownLatch connectedSignal = new CountDownLatch(1);    // Method to connect zookeeper ensemble.    XyzWatcher xyz = new XyzWatcher();    public ZooKeeper connect(String host) throws IOException,InterruptedException {        zoo = new ZooKeeper(host,5000,xyz);        return zoo;    }    // Method to disconnect from zookeeper server    public void close() throws InterruptedException {        zoo.close();    }}

转载地址:http://xqtbx.baihongyu.com/

你可能感兴趣的文章
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
海贼王十大悲催人物
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
git reset 三种用法总结
查看>>
hdfs笔记
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>