Java 同一对象的过度实例化?

Java 同一对象的过度实例化?,java,optimization,jvm,java-7,dalvik,Java,Optimization,Jvm,Java 7,Dalvik,将以下代码视为该想法的完全简化示例: 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) { in

将以下代码视为该想法的完全简化示例:

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);}
我有时会遇到这样的情况,在需要的地方准确地定义一个实现非常方便,但有时我还需要确保不会多次尝试创建同一个对象。 如果在运行时有一个优化,那么我感兴趣的是在不同的实现中如何处理它,特别是如果我将这些代码转换为在Android的Dalvik VM中运行会发生什么。
我知道我可以自己测试这个问题,但我想知道是否有人已经对这个问题有所了解。

每执行一次新操作,就会实例化一次。有可能在JIT后(例如10000次后),逃逸分析会消除它,但我不认为它会消除

如果它足够聪明,不需要创建单独的实例,那么它就足够聪明,可以消除它,哪一个更好

问题是——它会被实例化10次还是只被实例化一次

10次,因为这是你告诉它的。我会惊讶地看到JVM或Dalvik注意到apply没有副作用,并且对象没有状态,因此不需要创建单独的实例。这是可能的——Hotspot给人留下了深刻的印象——但对我来说,这似乎是一个不太可能的优化


当然,创建每个对象可能很便宜,但最好按照第二个代码片段创建一个对象。

因此,我只有两个选择:按照第二个示例编写代码,或者花一年时间创建另一种不太酷的JVM编译语言,对吗?@SargeBorsch:或者稍微降低性能。您通常需要在优化代码和清晰代码之间找到平衡。确保您在需要的地方进行优化,并以产生显著差异的方式进行优化。
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);}