记得第一次接触闭包的时候,觉得很奇怪,但从字面上很那理解闭包什么玩意,和闭包有的一比的当属控制反转,真正理解了后觉得就平常了。闭包二字其实是很经典的,闭包代码所表现的东西可不就是一个封闭的、自成一体的功能块吗?简单的说,闭包就是在内部定义的方法,拿到外面去使用。经典的javascript闭包形式如下:
function f1(){
var i = 20;
function closef(x){
alert(i+x);
}
return closef
}
var s = f1();
s(20);
javascript的这种闭包形式的确相当简洁,类似于c语言的函数指针
众所周知,java实现闭包的形式是内部类,更常用的还是匿名内部类,而这通常还需要定义接口,通过接口的引用来操作内部类对象,从而实现闭包,远没有javascript简洁。这里介绍我在开发中使用的一种java闭包形式,当然还是内部类,我在实现的时候把反射机制加了进来,这么做就是尽量使用起来简单一些。代码如下:
先定义一个接口,接口还是需要的,在以后的闭包使用中,只需要这一个接口。
package p;
public interface IMethod {
public Object invoke(Object ... objects );
}
该接口的实现类,这里引入反射:
package p;
import java.lang.reflect.Method;
public class MethodObject implements IMethod {
private Object target;//闭包所依赖的对象
private String methodName;//闭包方法的名字
public MethodObject(){}
public MethodObject(Object target, String methodName) {
super();
this.target = target;
this.methodName = methodName;
}
public Object invoke(Object... objects) {
Class clazz = target.getClass();
try {
Method[] ms = clazz.getDeclaredMethods();
Method targetMethod = null;
for(Method m : ms){
if(methodName.equals(m.getName())){
targetMethod = m;
break;
}
}
targetMethod.setAccessible(true);
return targetMethod.invoke(target, objects);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public void rebund(Object anothertarget){
target = anothertarget;
}
}
下面是具体使用闭包的形式:
public class Person {
private int age = 0;
public Person(int age) {
super();
this.age = age;
}
public IMethod getClosualMethod(){
final int i = 10;
Object o = new Object(){
Date getBirthday(){
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR,c.get(Calendar.YEAR) - (age+i));
return c.getTime();
}
};
MethodObject mo = new MethodObject(o,"getBirthday");
return mo;
}
}
package test;
import p.IMethod;
public class Test {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
Person p = new Person(20);
IMethod m = p.getClosualMethod();
Object o = m.invoke();
System.out.println(o);
IMethod m2 = p.getClosualMethod2();
m2.invoke("Tom");
}
}
下面是输出结果:
Sun Jun 03 17:35:05 CST 1979
hello Tom, I am 20 years old
从这里可以看到,有了Imethod和MethodObject,在java里使用闭包,就可以像javascript那样方便了。当然,这只是模拟,如果想要达到javascript那样在运行期改变对象的属性和方法,可以在更高一级去模拟。
分享到:
相关推荐
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
C语言实现三种闭包算法,能够实现传递,自反,对称闭包
It is important in distributed computer systems to identify those events (at identifiable points in time) that are concurrent, or not related to each other in time. A group of concurrent events may ...
主要介绍了详解Java的闭包,作者从Lambda和默认方法等重要特性深入讲解,极力推荐!需要的朋友可以参考下
Java8 Java7 练手 类似于SessionTemplate
传递闭包的Warshall算法,java实现
离散数学中传递闭包是用Warshall算法求的,此程序正式这种算法的C语言实现
1.4闭包的主要实现形式 1.5闭包的优缺点 1.6闭包的使用 2.垃圾回收机制 总结 前言 正文 1.闭包 1.1闭包是什么? 1.2闭包的特性 1.3理解闭包 1.4闭包的主要实现形式 1.5闭包的优缺点 1.6...
用C语言实现传递闭包的warshall算法
离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...
C语言实现的属性集X关于函数依赖集F的闭包的算法,数据库老师让写的一个算法,上传到CSDN赚点C币的同时,希望能帮到你
学会用C语音编写自反闭包,对称闭包,传递闭包,加深对关系运算的理解。
C++实现的传递闭包的求解及验证,对关系矩形图进行传递闭包的求解!~
以闭包的形式设计实现ztree增删改查,提高节点的查询以及操作,包括对节点排序操作,仅供参考,希望给需要的朋友带来帮助,谢谢支持!
首先让用户输入一个关系集合,...我们可以设计一个Relation这样的类,将对关系的各种操作放入其中,然后我们在主函数中调运这个类就可以实现关系的传递闭包运算了。 通过矩阵来实现 1,0,0,0 1,1,0,1 0,1,1,0 1,0,1,1
离散数学 闭包运算 传递闭包 自反闭包 对称闭包 warshell算法 普通算法 有界面 java编程
找“共同朋友”的一个简单验证 含绘制关系图
声明:以下仅个人观点,若有错误,敬请指正O(∩_∩)O~ 关键点 1) 将函数依赖用multimap,string> 存储,因为函数依赖可能...对每一个子集求其闭包,记为Ri+;然后求Ri+的所有子集记为(Ri+)j;最后做映射Rià(Ri+)j。
自己码的代码,R语言实现,