回调函数是什么鬼(java)

回调函数(callback)是什么鬼?(java)


这篇文章我们来谈一谈回调函数,什么是回调函数?

下面是百度百科的解释:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

所以说回调函数其实就是对某一事件的相应,也就是在某动作发生前或发生后执行调用的函数就称为回调函数。

实现简单的回调


现在我们来实现简单的回调函数,既然回调函数是某事件发生后调用的方法,那么我们只需要在相应的逻辑处理之后调用回调函数就好啦,例如下面:

void doSomething(){
    /*
    *
    * do someting here
    *
    */
    callback();
}

看就是这么简单在完成了相应的动作do someting 后callback()肯定会执行,这就相当于完成事件do someting后触发了事件。

好了,但是上面的简单回调例子有个问题,就是callback()函数是被硬编码到了doSomething()当中,这段程序毫无可重用性,毫无拓展性。

改进版的回调


上面的简单回调虽说实现了事件触发回调函数的功能,但是因为是把callback()硬编码到了doSomething()中所以缺毫无实用性,代码毫无可重用性。

如果说我现在想修改callback()我就要大费周章的在doSomething()里面去改动,所以能否有一种方法能够把我自己想要回调的函数传递进去或许好一点呢。

大家可能马上想到了C++的函数指针了,没错我们只要在doSomething()的参数列表里面加上一个callback()的函数指针形参就能够完美的实现我们想要的功能,在dosomething之后调用任何我们想要的函数(逻辑),只要我们能够传递函数的指针到doSomething()中就可以了。

但是有一个问题在java里面没有指针这种神器,但是我们可以通过类(class)传递到方法从而传递我们自己实现的任意回调函数到doSomething()里面,类似代码如下:

class SomeClass{
    public void callback(){
        /*
        *  this is callback
        */
    }
}

下面就是把SomeClass传递到doSomething()里面,再由doSomething()调用SomeClass里面的callback()。

void doSomething(SomeClass someclass){
    /*
    *
    *  do something here
    *
    */
    someclass.callback();
}

好了,多么漂亮啊,只要传递类就能够实现类似C++的函数指针的功能,现在我们只要把不同的类传递到doSomething(SomeClass someclass)里面就可以实现事件发生后调用任何自己想要的回调函数。

好了,但是还是有一个问题就是doSomething(SomeClass someclass)这个函数只认识SomeClass这个类,加入其他类传入进来,想都不用想可能会发生异常。

下面就来解决这个问题。

终极版的回调


上面我们知道加入我们传递别的类实例到doSomething(SomeClass someclass)里面将会发生异常,因为doSomething(SomeClass someclass)只认得SomeClass类型的类,那怎么解决呢?

你可能会想让其他的类继承SomeClass并且重写callback()函数,就可以把其他的类传递到doSomething(SomeClass someclass)里了,其他的事情交给多态来管吧,就像下面的代码:

class otherClass extends SomeClass{

        @Override
        public void callback(){
        /*
        *  this is callback
        */
    }
}

好了,既然能想到继承SomeClass来实现,那么为什么不干脆就把SomeClass定义成接口。

嗯,接下来我们就吧SomeClass定义成接口。

interface CallbackInterface{
    void callback();
}

好了,这样在doSomething(SomeClass someclass)函数里面就可以吧形参改成接口SomeInterface了

void doSomething(CallbackInterface someinterface){
    /*
    *
    *  do something here
    *
    */
    someinterface.callback();
}

嗯,接下来只要任意的类实现CallbackInterface接口就可以实现自己的callback(),并且传递进doSomething(CallbackInterface someinterface)函数,类型的问题就交给多态吧,感谢多态,感谢世界。

下面就是实现了CallbackInterface接口的类SomeClassImp:

class SomeClassImp implements CallbackInterface{

    void callback(){
        /*
        *  this is callback
        */
    }
}

下面我们只需要把SomeClassImp传递到doSomething(CallbackInterface someinterface)函数:

doSomething(new SomeClassImp());

好了,现在doSomething()不跟任何类有瓜葛了,现在的doSomething()只认CallbackInterface接口,只要看到传递进来的类实现了CallbackInterface接口通通都可以通过,其他的一律报异常,哈哈。

这样我们只需要在需要实现自己的callback的时候实现CallbackInterface接口就OK了。

总结


感谢多态,感谢接口,感谢世界


喜欢我的内容吗?
关注下面的公众号吧
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值