受ruby影响昨天一时狗血写了这个东西
http://topic.csdn.net/u/20081114/20/1102ede3-ec28-494b-a78e-9b61bc8477ec.html睡觉前想了下发现误很大 心想丢人丢大了 于是大早起来更新了代码 特此重发例行声明:本文仅为技术探讨,并无实际价值 ,不喜请点右上红叉。分外java风格和FP风格两种实现java风格实现:---------------------------ClassicClosure -------------------------------
package org.shadowingfly.closure;
//模拟函数 假设函数的形参与本地变量(local variable)均以其实现类的field表示
//形参在实例化函数后传值 而本地变量在对象构造时初始化
//待改进 目前仅为简单模拟
public interface ClassicClosure {
Object launch();
}
------------------------外部函数COuntFunc----------------------------
package org.shadowingfly.closure;public class COuntFunc implements ClassicClosure {
private String fp;//形参fp
private String cmd;//形参 cmd
private ClassicClosure innerFunc = new ClassicClosure()//内部函数 innerFunc
{
//内部函数本体
public Object launch() {
System.out.println("welcome to " + fp);//访问外围执行堆栈形成闭包
return null;
}
}; public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getFp() {
return fp;
}
public void setFp(String fp) {
this.fp = fp;
} //外围函数本体 返回闭包函数
public Object launch() {
System.out.println("bye bye " + cmd);
return innerFunc;
}
}
---------------TestClassic测试用例----------------------
package org.shadowingfly.closure;public class TestClassic {
public static void main(String[] a)
{
COuntFunc out = new COuntFunc();//实例外围函数
out.setCmd("command");//形参传值
out.setFp("function programming");
ClassicClosure inner = ( ClassicClosure)out.launch();//执行外围函数 返回闭包函数
out = null;//假设释放堆栈
// inner.launch();
out = new COuntFunc();//实例化同一外围函数
out.setCmd("cmd");//传入不同值的形参
out.setFp("fp");
ClassicClosure inner2 = ( ClassicClosure)out.launch();//返回外围执行环境不同的同一闭包函数
out = null;
inner.launch();//分别执行动态创建的闭包函数
inner2.launch();
}
}
--------------------------------------------------------------------------------
优点:java原生语法实现,代码简单易读,且执行效率上有明显优势。
缺点:依赖于内部类,语言层面不支持函数指针,故对于复杂的嵌套,同一内部函数多次嵌套,多层嵌套等力不从心。
FP风格实现:第二种实现:使用函数式编程风格,通过模板类维护一个scope链实现堆栈闭包。 代码如下
Function类代码比较繁琐且与具体应用无关使用的时候只需复制即可,就懒得注释了,有兴趣的可以自己研究。
------------------- Function模板类----------------------
package org.shadowingfly.closure;import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;public abstract class Function implements Cloneable{
public LinkedList<Function> scope;
public Function()
{
scope = new LinkedList<Function>();
this.scope.add(this);
}
public void init() throws Exception
{
Field[] fields = this.getClass().getDeclaredFields();
for(Field field:fields)
{
if(((Class)field.getGenericType()).isAssignableFrom(Function.class))
{
field.setAccessible(true);
Function sub = (Function) field.get(this);
//System.out.println(sub);
sub.scope.addFirst((Function)this.clone());
}
}
}public Object getValue(String name) throws Exception
{
for(Function func:scope)
{
Field[] fields = func.getClass().getDeclaredFields();
for(Field field:fields)
{
if(field.getName().equals(name))
{
field.setAccessible(true);
return field.get(func);
}
}
}
return null;
}
public void setValue(String name,Object value)throws Exception
{
for(Function func:scope)
{
Field[] fields = func.getClass().getDeclaredFields();
for(Field field:fields)
{
if(field.getName().equals(name))
{
field.setAccessible(true);
field.set(func,value);
}
}
}
}
public Object launch()
{
try {
this.init();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}
-----------------------------OutFunc-------------------------------------
package org.shadowingfly.closure;
//外部函数抽象 假设形参与本地变量均作为field存在 且形参在执行前后传值 本地变量在构造时初始化
public class OutFunc extends Function{
private String fp ;//形参fp
private String cmd ;//形参cmd
public Function inner = new InnerFunc();//内部函数 inner
//外围函数本体 根据形参输出语句 并返回闭包函数
public Object launch()
{
super.launch();//执行默认动作
System.out.println("byebye "+cmd);
return inner;
}
}
-----------------------InnerFunc------------------------------
package org.shadowingfly.closure;
//内部函数抽象
public class InnerFunc extends Function{
//内部函数本体 访问外围执行堆栈的变量fp 并打印语句
public Object launch()
{
super.launch();//执行默认动作
try {
System.out.println("welcome to "+getValue("fp"));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}
--------------- Test测试用例--------------
package org.shadowingfly.closure;
import org.shadowingfly.closure.Function;
import org.shadowingfly.closure.OutFunc;
public class Test {
public static void main(String[] args) throws Exception {
OutFunc out = new OutFunc();//实例化外部函数
out.setValue("cmd", "command");//形参赋值
out.setValue("fp", "function programming");
Function inner = (Function)out.launch();//执行外部函数 并返回闭包
out = null;//假设释放外围堆栈
out = new OutFunc();//新实例化同一外部函数
out.setValue("cmd", "cmd");//传入不同形参
out.setValue("fp", "fp");
Function inner2 = (Function)out.launch();//返回不同执行堆栈的闭包
out = null;
inner.launch();//启动闭包函数1
inner2.launch();//启动闭包函数2
}}
-----------------------------------------------------------
优点:风格上更接近函数式编程,对于多层嵌套,复杂嵌套,循环嵌套提供较好的支持。
缺点:使用基类维护的scope链保存堆栈,代码侵入比较严重(如对外部堆栈变量的访问需使用getvalue()方法)且执行效率不高。
http://topic.csdn.net/u/20081114/20/1102ede3-ec28-494b-a78e-9b61bc8477ec.html睡觉前想了下发现误很大 心想丢人丢大了 于是大早起来更新了代码 特此重发例行声明:本文仅为技术探讨,并无实际价值 ,不喜请点右上红叉。分外java风格和FP风格两种实现java风格实现:---------------------------ClassicClosure -------------------------------
package org.shadowingfly.closure;
//模拟函数 假设函数的形参与本地变量(local variable)均以其实现类的field表示
//形参在实例化函数后传值 而本地变量在对象构造时初始化
//待改进 目前仅为简单模拟
public interface ClassicClosure {
Object launch();
}
------------------------外部函数COuntFunc----------------------------
package org.shadowingfly.closure;public class COuntFunc implements ClassicClosure {
private String fp;//形参fp
private String cmd;//形参 cmd
private ClassicClosure innerFunc = new ClassicClosure()//内部函数 innerFunc
{
//内部函数本体
public Object launch() {
System.out.println("welcome to " + fp);//访问外围执行堆栈形成闭包
return null;
}
}; public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getFp() {
return fp;
}
public void setFp(String fp) {
this.fp = fp;
} //外围函数本体 返回闭包函数
public Object launch() {
System.out.println("bye bye " + cmd);
return innerFunc;
}
}
---------------TestClassic测试用例----------------------
package org.shadowingfly.closure;public class TestClassic {
public static void main(String[] a)
{
COuntFunc out = new COuntFunc();//实例外围函数
out.setCmd("command");//形参传值
out.setFp("function programming");
ClassicClosure inner = ( ClassicClosure)out.launch();//执行外围函数 返回闭包函数
out = null;//假设释放堆栈
// inner.launch();
out = new COuntFunc();//实例化同一外围函数
out.setCmd("cmd");//传入不同值的形参
out.setFp("fp");
ClassicClosure inner2 = ( ClassicClosure)out.launch();//返回外围执行环境不同的同一闭包函数
out = null;
inner.launch();//分别执行动态创建的闭包函数
inner2.launch();
}
}
--------------------------------------------------------------------------------
优点:java原生语法实现,代码简单易读,且执行效率上有明显优势。
缺点:依赖于内部类,语言层面不支持函数指针,故对于复杂的嵌套,同一内部函数多次嵌套,多层嵌套等力不从心。
FP风格实现:第二种实现:使用函数式编程风格,通过模板类维护一个scope链实现堆栈闭包。 代码如下
Function类代码比较繁琐且与具体应用无关使用的时候只需复制即可,就懒得注释了,有兴趣的可以自己研究。
------------------- Function模板类----------------------
package org.shadowingfly.closure;import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;public abstract class Function implements Cloneable{
public LinkedList<Function> scope;
public Function()
{
scope = new LinkedList<Function>();
this.scope.add(this);
}
public void init() throws Exception
{
Field[] fields = this.getClass().getDeclaredFields();
for(Field field:fields)
{
if(((Class)field.getGenericType()).isAssignableFrom(Function.class))
{
field.setAccessible(true);
Function sub = (Function) field.get(this);
//System.out.println(sub);
sub.scope.addFirst((Function)this.clone());
}
}
}public Object getValue(String name) throws Exception
{
for(Function func:scope)
{
Field[] fields = func.getClass().getDeclaredFields();
for(Field field:fields)
{
if(field.getName().equals(name))
{
field.setAccessible(true);
return field.get(func);
}
}
}
return null;
}
public void setValue(String name,Object value)throws Exception
{
for(Function func:scope)
{
Field[] fields = func.getClass().getDeclaredFields();
for(Field field:fields)
{
if(field.getName().equals(name))
{
field.setAccessible(true);
field.set(func,value);
}
}
}
}
public Object launch()
{
try {
this.init();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}
-----------------------------OutFunc-------------------------------------
package org.shadowingfly.closure;
//外部函数抽象 假设形参与本地变量均作为field存在 且形参在执行前后传值 本地变量在构造时初始化
public class OutFunc extends Function{
private String fp ;//形参fp
private String cmd ;//形参cmd
public Function inner = new InnerFunc();//内部函数 inner
//外围函数本体 根据形参输出语句 并返回闭包函数
public Object launch()
{
super.launch();//执行默认动作
System.out.println("byebye "+cmd);
return inner;
}
}
-----------------------InnerFunc------------------------------
package org.shadowingfly.closure;
//内部函数抽象
public class InnerFunc extends Function{
//内部函数本体 访问外围执行堆栈的变量fp 并打印语句
public Object launch()
{
super.launch();//执行默认动作
try {
System.out.println("welcome to "+getValue("fp"));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}
--------------- Test测试用例--------------
package org.shadowingfly.closure;
import org.shadowingfly.closure.Function;
import org.shadowingfly.closure.OutFunc;
public class Test {
public static void main(String[] args) throws Exception {
OutFunc out = new OutFunc();//实例化外部函数
out.setValue("cmd", "command");//形参赋值
out.setValue("fp", "function programming");
Function inner = (Function)out.launch();//执行外部函数 并返回闭包
out = null;//假设释放外围堆栈
out = new OutFunc();//新实例化同一外部函数
out.setValue("cmd", "cmd");//传入不同形参
out.setValue("fp", "fp");
Function inner2 = (Function)out.launch();//返回不同执行堆栈的闭包
out = null;
inner.launch();//启动闭包函数1
inner2.launch();//启动闭包函数2
}}
-----------------------------------------------------------
优点:风格上更接近函数式编程,对于多层嵌套,复杂嵌套,循环嵌套提供较好的支持。
缺点:使用基类维护的scope链保存堆栈,代码侵入比较严重(如对外部堆栈变量的访问需使用getvalue()方法)且执行效率不高。
http://hi.baidu.com/liyistudio/blog/item/51314a2452262f348744f9c4.html