Java回调函数

  • C、C++ 允许将函数指针作为参数传递;
  • JavaScript、Python 允许将函数名作为参数传递。

在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。

在 main 函数中,我们异步发送一个请求,并且指定处理响应的回调函数,接着 main 函数去做其他事,而当响应到达后,执行回调函数。

当我们想要换一种“处理响应”的方法时,将必须去修改 CallBack 类的 processRequest()方法。而如果将 CallBack 类改为接口,我们就可以仅更换 CallBack 的实现了。

首先,写 CallBack 接口:

public interface CallBack {
    public void processResponse();
}

实现类:

public class CallBackImpl implements CallBack {
    @Override
    public void processResponse() {
        System.out.println("[CallBack]:处理响应");
    }
}

main方法:

public class Main {
    public static void main(String[] args) throws Exception {
        Request request = new Request();
        System.out.println("[Main]:我开个线程去异步发请求");
        CallBack callBack = new CallBackImpl();
        new Thread(() -> {
            try {
                request.send(callBack);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
        System.out.println("[Main]:请求发完了,我去干点别的");
        Thread.sleep(100000);
    }
}

例子:

1、首先定义一个回调接口,只有一个方法tellAnswer(int answer),即学生思考完毕告诉老师答案:

/**
  * 回调接口
  */
 public interface Callback {
 
     public void tellAnswer(int answer);
}

2、定义一个老师对象,实现Callback接口:

/**
  * 老师对象
   */
  public class Teacher implements Callback {
  
      private Student student;
      
      public Teacher(Student student) {
          this.student = student;
     }
     
     public void askQuestion() {
         student.resolveQuestion(this);
     }
     
     @Override
     public void tellAnswer(int answer) {
         System.out.println("知道了,你的答案是" + answer);
     }
     
}

老师对象有两个public方法:

(1)回调接口tellAnswer(int answer),即学生回答完毕问题之后,老师要做的事情

(2)问问题方法askQuestion(),即向学生问问题

3、接着定义一个学生接口,学生当然是解决问题,但是接收一个Callback参数,这样学生就知道解决完毕问题向谁报告:

/**
* 学生接口
*/
public interface Student {
    public void resolveQuestion(Callback callback);
}

最后定义一个具体的学生叫Ricky:

public class Ricky implements Student {
 
    @Override
     public void resolveQuestion(Callback callback) {
        // 模拟解决问题
          try {
             Thread.sleep(3000);
         } catch (InterruptedException e) {
             
         }
         
         // 回调,告诉老师作业写了多久
         callback.tellAnswer(3);
     }
}

测试


 public class CallbackTest {
 
     @Test
     public void testCallback() {
         Student student = new Ricky();
         Teacher teacher = new Teacher(student);
         teacher.askQuestion();
     }
}

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值