概述
接口回调能实现的核心:接口对象可以被替换为实现这个接口的类的对象
//不会报错
InterfaceA a;
a=new A();
回调一直是一个JAVA中很重要的概念,应用场景:
A.class需要使用B.class的方法,然后A还需要在B的方法执行完毕后,作出对应反应,即在B的方法中还需要回调到将它new出来的A的方法。
为了方便理解,我们用到接口,做个简单的demo:
学生做完了作业,需要找家长检查,家长检查学生的作业是否准确完成,如果完成了就告诉学生可以玩游戏了,否则告诉学生继续做作业。
第一步:建立学生接口:InterfaceStudent (家长可以通过这个接口来找到学生并告诉他需要做的事情)
public interface InterfaceStudent {
void playGame();//学生可以玩游戏了
void doHomework();//学生还要写作业
}
第二步:建立学生类,实现这个接口 并且实现方法CheckHomework()来请家长帮忙检查作业
public class Student implements InterfaceStudent {
public boolean isMyHomeworkFinishde;//判断作业是否写完
private Parents mParents;//这个学生对应的家长
Student(){//重写构造方法 建立学生对象时 也 建立其对应家长对象
mParents=new Parents(this);
}
void setMyHomeworkFinishde(boolean isMyHomeworkFinishde){
this.isMyHomeworkFinishde=isMyHomeworkFinishde;
}
void CheckHomework(){//请家长来检查作业
mParents.check(this.isMyHomeworkFinishde);
}
@Override
public void playGame() {
System.out.println("可以打游戏了!");
}
@Override
public void doHomework() {
System.out.println("继续写作业!");
}
}
建立Parents.class来实现检查作业的方法check(),并根据情况回调学生的玩游戏或者继续写作业方法
public class Parents {//家长 来判断学生该做什么
InterfaceStudent mStudent;//先通过接口建立家长对应的学生对象
Parents(Student mStudent){//绑定家长和学生
this.mStudent=mStudent;
}
//检查学生的作业 看看是否完成 并对学生作出相应指示
public void check(boolean isMyHomeworkFinishde){
if (isMyHomeworkFinishde){
mStudent.playGame();
}
else{
mStudent.doHomework();
}
};
}
最后就是Test类啦:
public class Test {
public static void main(String[] args){
//A同学作业没有完成让家长检查
Student studentA=new Student();
studentA.setMyHomeworkFinishde(false);
studentA.CheckHomework();
//B同学作业完成让家长检查
Student studentB=new Student();
studentB.setMyHomeworkFinishde(true);
studentB.CheckHomework();
}
}
运行结果就这样的啦:
继续写作业!
可以打游戏了!
Process finished with exit code 0
以上就是比较好理解的“接口回调”了
看到这里,有些同学可能要问了:这不坑爹吗!这个InterfaceStudent接口起个毛用呀!我直接在Parents里边声明Student对象 构造函数传入学生对象不就好了吗?如下:
//这种方式也是可行的 但不推荐 因为请家长检查作业的不一定是学生
//比如我家的dog也实现了InterfaceStudent接口 请家长检查作业呢 对吧
//android开发中 activity和fragment有时候会共用一个presenter
public class Parents {//家长 来判断学生该做什么
private Student mStudent;
Parents(Student mStudent){
this.mStudent=mStudent;
}}
暴躁老哥稍安勿躁,以上例子其实是个非常简单的示范,但至少还是是实现了回调这个机制呀。在以上做法中,加入接口反而让代码显得多余。但其实再大型项目中,这个接口的存在非常重要,因为项目中有多个家长和多个学生,我们需要这个接口来统一规定学生和父母能做的事情,方便管理。(瞎机吧扯,这样做的原因除了满足一些特殊需求外,主要还是为了解耦)
那么接下来我们可以稍微扩展一下:
如果我们在原本的基础上增加一个要求:学生在等待家长检查作业的时候,可以先去吃饭,那么是不是就需要开一个线程,这个线程中家长去检查作业,学生自己去做自己的事情,家长检查完毕再作出反馈。这种方式叫做异步回调。
很简单,只需要在学生请家长检查作业的方法中加入一个线程就可以了:
void CheckHomework(){//请家长来检查作业
//异步请求
new Thread(new Runnable() {
@Override
public void run() {
mParents.check(isMyHomeworkFinishde);
}
}).start();
this.doOther();
}
public void doOther(){
System.out.println("我先去扫地啦!");
}
运行结果:
我先去扫地啦!
我先去扫地啦!
继续写作业!
可以打游戏了!
Process finished with exit code 0
总结一下,以上的接口回调其实不规范
1.应该在main中建立parents对象,然后通过student构造函数赋值,我直接在构造函数中new了
2.parents传入Student对象应该在check中添加Student形参,然后再赋值,或者单独给一个方法给student赋值
因为parent也会有单独的属性事情要设置等待
以上都是代码规范的问题,以后多多注意!
在android的开发中MVP架构大量使用了接口回调,并且封装的很好,要习惯这种解耦方式。
最后
以上就是敏感云朵为你收集整理的Java中如何实现接口回调_JAVA接口回调原理简单实现的全部内容,希望文章能够帮你解决Java中如何实现接口回调_JAVA接口回调原理简单实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复