【发布时间】:2012-09-23 19:13:31
【问题描述】:
我已经对使用匿名类和本地类实现闭包的区别进行了一些搜索。我正在尝试找出两者之间的所有差异,以便知道哪种方法在哪种情况下更好。
如果我错了,请纠正我:
- 每次创建新实例时,匿名类都会创建一个类实例和对象实例。
- 每次创建新实例时,本地类只有一个对象实例。
因此,我是否应该在某个时间或地点使用匿名类而不是本地类?
编辑:两者之间似乎没有真正的区别,只是取决于样式以及是否要重用该类。
为了澄清我的意思,我举了一个例子:
public class ClosureExample {
interface Function {
void func(int value);
}
public static void main(final String[] args) {
final Function local1 = localClassClosure("Local1");
final Function local2 = localClassClosure("Local2");
final Function anonymous1 = anonymousClassClosure("Annonymous1");
final Function anonymous2 = anonymousClassClosure("Annonymous2");
for (int i = 0; i < 3; i++) {
local1.func(i);
local2.func(i);
anonymous1.func(i);
anonymous2.func(i);
}
}
private static Function localClassClosure(final String text) {
// Local class name is irrelevant in this example
class _ implements Function {
@Override public void func(final int value) {
System.out.println(text + ":" + value);
}
}
return new _();
}
private static Function anonymousClassClosure(final String text) {
return new Function() {
@Override public void func(final int value) {
System.out.println(text + ":" + value);
}
};
}
}
希望有人能详细解释一下这种细微的差别,以及在什么情况下应该使用哪种方法。
【问题讨论】:
-
为什么下划线是类名?
-
类实例和对象实例是什么意思?
-
通过类实例,我指的是类加载器正在加载到JVM中的类。
-
请注意,本问题中讨论的 Java 8 之前的“闭包”在通常接受的意义上并不是真正的闭包。不同之处在于封闭范围内的变量必须都是
final。这允许通过将这些变量的影子副本添加到内部/匿名类作为隐藏变量来模拟闭包行为。