前几天在左讯飞语音的时候,无意间意识到java中的接口和js中常用的回调函数有点类似,今天在这儿整理一下思路。
interface,Java中的接口,为什么会有这个东西。
一,预留声明
比如两个程序员A和B,A要写一段程序,其中需要调用到B写的程序。这时候A可以写一个接口:
public interface Demo{ void deal(); }
A要调用的方法先“预留声明”在接口里:deal
然后B去完善这个接口,B写了一个实现类实现了这个Demo接口。
A在自己的业务逻辑里面只用调用接口的方法就可以了,至于具体怎么实现,不管他,留给B去做。
二,API
我在做讯飞语音的时候,有这样一段逻辑,调用讯飞语音的语音识别API。
其中有个讯飞API的接口类 RecognizerListener,这个接口是需要我来实现的,里面有好几个方法,我需要都实现,然后把这个接口的实例(对象)传给讯飞,
讯飞识别完成后,调用这个接口里面的方法(回调函数),这时候接口的功能体现出来了。(讯飞并不知道识别完成后,我要干什么事,所以他预留了接口,我实现了给讯飞,他来调用)
在返回结果的时候,我需要对识别的结果(字符串)进行处理,
//1.创建SpeechRecognizer对象 SpeechRecognizer mIat= SpeechRecognizer.createRecognizer( ); //2.设置听写参数,详见《MSC Reference Manual》SpeechConstant类 mIat.setParameter(SpeechConstant.DOMAIN, "iat"); mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); mIat.setParameter(SpeechConstant.ACCENT, "mandarin "); //3.开始听写 mIat.startListening(mRecoListener); //听写监听器 private RecognizerListener mRecoListener = new RecognizerListener(){ //接口方法需要实现 public void onResult(RecognizerResult results, boolean isLast){
//在这里得到时语音别结果,按照我的业务逻辑来处理结果,每个人写的都不同。这个方法讯飞调用了,我只用实现
DebugLog.Log("Result:"+results.getResultString ()); } //会话发生错误回调接口 public void onError(SpeechError error) { error.getPlainDescription(true) //获取错误码描述 } //开始录音 public void onBeginOfSpeech() {} //音量值0~30 public void onVolumeChanged(int volume){} //结束录音 public void onEndOfSpeech() {} //扩展用接口 public void onEvent(int eventType,int arg1,int arg2,String msg) {} };
在开发API的时候常常需要用到接口,给调用者使用,因为你不知道调用者要怎么实现他自己的业务逻辑,那就给他个接口让他自己写去呗!
js中的回调函数,例如jQuery的ajax,
$.ajax({ url:"", type:"", success:function(){ //回调函数,这里实现自己的逻辑 } });
js中直接传一个函数过去,
java中需要传一个接口对象过去,系统来调用这个接口对象里面的方法。