【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编程思想里面感觉好多这种绕来绕去的代码= =,我又不敢说不实用,不然我觉得绝壁有一群人出来喷我。。。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。