看起来匿名类提供了闭包的基本功能,这是真的吗?
看起来匿名类提供了闭包的基本功能,这是真的吗?
http://madbean.com/2003/mb2003-49/
有趣的是,现在Java可以取消final关键字的限制,因为现在每个人都更加熟悉垃圾收集器,从语言角度来看,这是完全兼容的。虽然解决此问题的方法很简单,只需在匿名对象上定义实例变量,您可以随意修改这些变量。实际上,通过编译器向匿名类添加公共实例变量,并重写源代码以使用这些变量而不是堆栈变量,这可能是实现闭包样式引用本地作用域的简单方法。
public Object someFunction() {
int someValue = 0;
SomeAnonymousClass implementation = new SomeAnonymousClass() {
public boolean callback() {
someValue++;
}
}
implementation.callback();
return someValue;
}
将被重写为:
public Object someFunction() {
SomeAnonymousClass implementation = new SomeAnonymousClass() {
public int someValue = 0;
public boolean callback() {
someValue++;
}
}
implementation.callback();
// all references to someValue could be rewritten to
// use this instance variable instead.
return implementation.someValue;
}
final
主要是为了向后兼容。 - Adam Gent在我看来,它们都有类似的作用,但闭包旨在更加简洁并可能提供更多功能。
假设您想使用匿名类来使用本地变量。
final int[] i = { 0 };
final double[] d = { 0.0 };
Runnable run = new Runnable() {
public void run() {
d[0] = i[0] * 1.5;
}
};
executor.submit(run);
int i = 0;
double d = 0.0;
Runnable run = { => d = i * 1.5; };
executor.submit(run);
executor.submit({ => d = i * 1.5; });
executor.submit() {
d = i * 1.5;
}