服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - java 实现回调代码实例

java 实现回调代码实例

2020-05-29 14:39java教程网 JAVA教程

本文主要介绍Java的回调机制,并附实例代码以供大家参考学习,有需要的小伙伴可以看下

JAVA实现回调

熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。

Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。

例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:

java" id="highlighter_473368">
?
1
2
3
4
public interface InterestingEvent {
 // 这只是一个普通的方法,可以接收参数、也可以返回值
 public void interestingEvent();
}

这样我们就有了任何一个实现了这个接口类对象的手柄grip。

当一事件发生时,需要通知实现InterestingEvent 接口的对象,并调用interestingEvent() 方法。

?
1
2
3
4
5
6
7
8
9
class EventNotifier {
 private InterestingEvent ie;
 private boolean somethingHappened;
 
 public EventNotifier(InterestingEvent event) {
  ie = event;
  somethingHappened = false;
  }
public void doWork() {<br>        if (somethingHappened) {<br>            // 事件发生时,通过调用接口的这个方法来通知<br>            ie.interestingEvent();<br>        }        <br>    }<br>}

在这个例子中,用somethingHappened 来标志事件是否发生。

希望接收事件通知的类必须要实现InterestingEvent 接口,而且要把自己的引用传递给事件的通知者。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class CallMe implements InterestingEvent {
 private EventNotifier en;
 
 public CallMe() {
  // 新建一个事件通知者对象,并把自己传递给它
  en = new EventNotifier(this);
 }
 
 // 实现事件发生时,实际处理事件的方法
 public void interestingEvent() {
  // 这个事件发生了,进行处理
 }
}

以上是通过一个非常简单的例子来说明Java中的回调的实现。

当然,也可以在事件管理或事件通知者类中,通过注册的方式来注册多个对此事件感兴趣的对象。

1. 定义一个接口InterestingEvent ,回调方法nterestingEvent(String event) 简单接收一个String 参数。

?
1
2
3
interface InterestingEvent {
 public void interestingEvent(String event);
}

2. 实现InterestingEvent接口,事件处理类

?
1
2
3
4
5
6
7
8
9
class CallMe implements InterestingEvent {
 private String name;
 public CallMe(String name){
  this.name = name;
 }
 public void interestingEvent(String event) {
  System.out.println(name + ":[" +event + "] happened");
 }
}

3. 事件管理者,或事件通知者

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class EventNotifier {
 private List<CallMe> callMes = new ArrayList<CallMe>();
 
 public void regist(CallMe callMe){
  callMes.add(callMe);
 }
 
 public void doWork(){
  for(CallMe callMe: callMes) {
   callMe.interestingEvent("sample event");
  }
 }
}

4. 测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CallMeTest {
 public static void main(String[] args) {
  EventNotifier ren = new EventNotifier();
  CallMe a = new CallMe("CallMe A");
  CallMe b = new CallMe("CallMe B");
 
  // regiest
  ren.regist(a);
  ren.regist(b);
  
  // test
  ren.doWork(); 
 }
}

以上就是对Java回调机制的介绍,有需要的同学可以参考下。

延伸 · 阅读

精彩推荐
  • JAVA教程谈谈Java中Volatile关键字的理解

    谈谈Java中Volatile关键字的理解

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本...

    小眼儿3612020-04-14
  • JAVA教程eclipse怎么引入spring boot项目插件的方法

    eclipse怎么引入spring boot项目插件的方法

    这篇文章主要介绍了eclipse怎么引入spring boot项目插件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    莫采4272019-07-08
  • JAVA教程MyBatis批量插入(insert)数据操作

    MyBatis批量插入(insert)数据操作

    本文给大家分享MyBatis批量插入(insert)数据操作知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 ...

    chenzhou1235202482020-05-20
  • JAVA教程Spring Cloud Alibaba Nacos 入门详解

    Spring Cloud Alibaba Nacos 入门详解

    这篇文章主要介绍了Spring Cloud Alibaba Nacos入门详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    幻楚4502019-06-22
  • JAVA教程java servlet结合Oracle搭建java的web开发环境

    java servlet结合Oracle搭建java的web开发环境

    今天我将与大家分享一下我学JAVA WEB写的一些小实例 ,我个人是不太喜欢书本上的晦涩的概念的,所以我花了更多的时间在一些应用实例上,我觉得这样的...

    hebedich2262020-03-13
  • JAVA教程Struts2在打包json格式的懒加载异常问题

    Struts2在打包json格式的懒加载异常问题

    这篇文章主要为大家详细介绍了Struts2在打包json格式的懒加载异常问题,感兴趣的小伙伴们可以参考一下 ...

    eson_151202020-05-13
  • JAVA教程JVM Tomcat性能实战(推荐)

    JVM Tomcat性能实战(推荐)

    下面小编就为大家带来一篇JVM Tomcat性能实战(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian5032020-05-01
  • JAVA教程Java使用Deque实现堆栈的方法

    Java使用Deque实现堆栈的方法

    这篇文章主要介绍了Java使用Deque实现堆栈的方法,实例分析了java简单实现堆栈的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    鉴客2222019-12-27