Java中的闭包与回调
来源:互联网 发布:淘宝怎么找人刷销量 编辑:程序博客网 时间:2024/06/05 20:02
一个难点,写到自己的blog,一天看一次,不怕看不懂
闭包 是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域
通过这个定义,可以看出内部类是面向对象的闭包
因为这不仅包含外围类对象("创建内部类的作用域")的信息
还自动拥有一个指向此外围类对象的引用
在此作用域内,内部类有权操作所有的成员,包括private
Java最引人争议的问题之一就是,人们认为Java应该包含某种类似指针的机制,
以允许回调(callback),通过回调,对象能够携带一些信息,
这些信息允许他在稍后的某个时刻调用初始的对象
通过内部类提供闭包的功能是完美的解决方案,他比指针更灵活,更安全
interface Incrementable
...{
void increment();
}
class Callee1 implements Incrementable
...{
private int i=0;
public void increment()
...{
i++;
System.out.println(i);
}
}
class MyIncrement
...{
void increment()
...{
System.out.println("Other operation");
}
static void f(MyIncrement mi)
...{
mi.increment();
}
}
class Callee2 extends MyIncrement
...{
private int i=0;
private void incr()
...{
i++;
System.out.println(i);
}
private class Closure implements Incrementable
...{
public void increment()
...{
incr();
}
}
Incrementable getCallbackReference()
...{
return new Closure();
}
}
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);
Caller caller1 = new Caller(c1);
Caller caller2 = new Caller(c2.getCallbackReference());
caller1.go();
caller1.go();
caller2.go();
caller2.go();
}
}
...{
void increment();
}
class Callee1 implements Incrementable
...{
private int i=0;
public void increment()
...{
i++;
System.out.println(i);
}
}
class MyIncrement
...{
void increment()
...{
System.out.println("Other operation");
}
static void f(MyIncrement mi)
...{
mi.increment();
}
}
class Callee2 extends MyIncrement
...{
private int i=0;
private void incr()
...{
i++;
System.out.println(i);
}
private class Closure implements Incrementable
...{
public void increment()
...{
incr();
}
}
Incrementable getCallbackReference()
...{
return new Closure();
}
}
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);
Caller caller1 = new Caller(c1);
Caller caller2 = new Caller(c2.getCallbackReference());
caller1.go();
caller1.go();
caller2.go();
caller2.go();
}
}
- java中的闭包与回调
- Java中的闭包与回调
- Java中的闭包与回调
- Java中的闭包与回调
- java中的闭包与回调
- Java中的闭包与回调
- java中的闭包与回调
- JAVA中的闭包与回调
- 【ThinkingInJava】18、 关于java中的闭包与回调
- java中的闭包和回调
- java中的闭包和回调
- java中的闭包和回调
- Java 闭包与回调
- JAVA中的闭包
- java中的闭包
- java中的闭包
- 详解Java中的闭包(Closure)和回调
- Java中的闭包(Closure)和回调
- 写了个邮箱上传工具,将以前的Wup更新了。。。
- PB用odbc连接sql server200
- 威盛 VN896 移动 PCI Express 芯片组将Vista引入笔记本平台,实现视觉完美体验http://www.viatech.com.cn/cn/products/chipsets/v-series/vn896/
- ajax
- Java正则表达式入门
- Java中的闭包与回调
- JAVA2核心技术第1卷 笔记 02
- 用C++实现warshall的算法
- 水晶报表建立数据集之后进行绑定
- ORACLE -- DATE和TIMESTAMP数据类型的比较
- 关于华为的高薪和华为的加班
- 必须学会的几个网络测试命令
- 交流
- Ajax常见错误(1)