【ThinkingInJava】18、 关于java中的闭包与回调
/** * 书本:《Thinking In Java》 * 功能:关于java中的闭包与回调,这里回调区别于C++,C++中回调的话寄托于指针 * 文件:Callbacks.java * 时间:2015年4月3日20:26:43 * 作者:cutter_point */ package Lession10innerclasses; import static net.mindview.util.Print.*; //创建一个接口,包含一个函数 interface Incrementable { void increment(); } //接口中没有上面特别的地方,实现这个接口很简单,直接覆盖方法就可以了 class Callee1 implements Incrementable { private int i = 0; @Override public void increment() { ++i; print(i); } } //然后我们要有一个类,里面有一个和上面接口一样的方法,只是具体实现的方式不一样 class MyIncrement { public void increment() { print("Other operation"); } static void f(MyIncrement mi) { mi.increment(); } } //如果我们必须继承上面的MyIncrement的话,那么上面那个里面已经有了具体的方法实现了,如果我们把它覆盖的话,那么上面的那个的功能就不能用了 class Callee2 extends MyIncrement { private int i = 0; public void increment() { super.increment(); //实现父类的这个方法,然后再是自己的方法 ++i; print(i); } //如果自己也想有一个对应的increment方法的话,那么就用内部类实现 private class Closure implements Incrementable { void test() {} @Override public void increment() { Callee2.this.increment(); //这个调用的是Callee2,也就是外部类的方法 } } Incrementable getCallbackReference() { return new Closure(); } } //为了调用increment函数,我们建立一个对象,专门调用函数的调用者 class Caller { private Incrementable callbackReference; Caller(Incrementable cbh) { callbackReference = cbh; } void go() { callbackReference.increment(); } } public class Callbacks { public static void main(String [] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); System.out.println("------------------------"); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go();//第二次调用的时候变成了2 System.out.println("------------------------"); caller2.go(); //还是回到了c2的increment()调用了,因为在c2.getCallbackReference()里面又回来调用了外部类,也就是c2的内部类的外部类,就是c2 caller2.go(); } }
输出:
Other operation obj1
1 obj1
------------------------
1 obj1
2 obj1
------------------------
Other operation obj1
2 obj1
Other operation obj1
3 obj1
里面caller2.go()的注释我都觉得莫名其妙,真TM绕口,哎,java编程思想里面感觉好多这种绕来绕去的代码= =,我又不敢说不实用,不然我觉得绝壁有一群人出来喷我。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。