考虑以下代码作为该想法的完全简化示例:
public class Main {
public static void foreach(int[] x, intVoid action) {
for (int i = 0; i < x.length; ++i) {
action.apply(x[i]);
}
}
public static void main (String[] args) {
int[] h = new int[] {2, 3, 5, 7, 11, 13};
for (int i = 0; i < 10; ++i) {
foreach(h, new intVoid() {
public void apply(int x) {
System.out.println(x * 2);
}
});
}
}
}
interface intVoid {public void apply(int x);}
在 for 循环中foreach
,从逻辑的角度来看,我们使用完全相同的参数进行调用,因为我们接口的匿名实现不依赖于上下文中的任何内容。问题是——它会被实例化 10 次还是只被实例化一次?或者,类似地,它是否等同于以下代码:
public class Main {
public static void foreach(int[] x, intVoid action) {
for (int i = 0; i < x.length; ++i) {
action.apply(x[i]);
}
}
public static void main (String[] args) {
int[] h = new int[] {2, 3, 5, 7, 11, 13};
intVoid action = new intVoid() {
public void apply(int x) {
System.out.println(x * 2);
}
};
for (int i = 0; i < 10; ++i) {
foreach(h, action);
}
}
}
interface intVoid {public void apply(int x);}
我有时会遇到这种情况,在需要的地方准确定义实现非常方便,但有时我还需要确保不会尝试多次创建同一个对象。如果运行时有优化,那么我对如何在不同的实现中进行处理很感兴趣,特别是如果我将这些代码转换为在 Android 的 Dalvik VM 中运行会发生什么。
我知道我可以自己测试这一切,但我想知道是否有人已经对这个问题有所了解。