gpt4 book ai didi

java - JDK 编译器优化了没有实例变量的匿名类的使用?

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:20 25 4
gpt4 key购买 nike

我很好奇,我经常看到这种事情:

Arrays.sort(array, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return Math.abs(a) < Math.abs(b);
}
});

既然这里创建的匿名类没有实例变量,那么标准的JDK编译器是否足够聪明,只实例化那个匿名类一次并重用它呢?或者是否建议在静态字段中实例化该匿名类并始终传递静态 Comparator 对象?

更新:当我说“JDK 编译器”时,我指的也是 JIT 部分。以上也只是一个例子。我真的很好奇,作为最佳实践,我是否应该为上述内容创建静态字段而不是内联匿名类实例化。在某些情况下,性能/资源使用问题可以忽略不计。但其他情况可能不是...

最佳答案

javac 绝对不会做这样的事情;那会违反语言语义。 JVM 理论上可以优化它,但它还没有那么聪明。静态的会更快。

具有讽刺意味的是,这样的分析和优化对于 javac 来说很容易,而且今天可以完成,除非它被禁止这样做 - 来源说 new,所以 javac 必须 new.

有传言说java 8即将推出的lambda表达式会在这个问题上做出努力,在

Arrays.sort(array, (Integer a,Integer b) => Math.abs(a)<Math.abs(b) )

需要javac来分析lambda是无状态的,lazily创建一个单实例就够了,这就是它必须把代码编译成的。

关于java - JDK 编译器优化了没有实例变量的匿名类的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com