现代JVM是否优化了简单的内联匿名类分配?

我今天得到了一个代码审查备注,将这个匿名类提取到一个字段中,以避免一遍又一遍地分配它:

Collections.transform(new Function(){ Bar apply(Foo foo) { // do some simple local transform of foo into a Bar. } }); 

我回答说“没关系,JVM优化它”。 虽然我知道这个“优化”不会以任何方式影响性能,但我认为让内联代码可访问的附加值是值得的,我很好奇我是否对JVM优化是正确的。 所以,我的问题是 – 它提议的重构绝对是一个无操作 ,因为JVM无论如何都会优化它,或者这里有一些微小的理论性能增益?

我不会特别期望它能够优化它,不。

它必须确保Collections.transform永远不会隐藏Function ,并且该方法本身永远不会使其可见等等。显然所有这些都是可行的 – 但是对于相对较小的收益而言,它可能会做很多工作。几点情况。

现在,如果没有仔细检查,任何特定的VM都很难说 – 但我认为“它不会显着影响性能”比“JVM优化它”更合理。

是否将其提取到字段中应该取决于您调用它的频率以及父类持续多长时间。 如果父类和应用程序一样长,并且你在蓝色的月亮中称这个东西一次,为什么还要为实现这样一个微不足道的操作而烦恼呢? 相反,如果你经常调用这个东西,那么将它保存在变量中以节省创建多个对象的麻烦。

我认为我自己的经验法则是,如果内部类的范围在方法调用中,并且您的方法对性能不重要且实现很小,则将其保留在原来的位置。

我不认为JVM会对其进行优化 – 可能,性能损失不值得优化成本。 但是,内联代码的巨大好处远大于它。

如果要每次都内联代码而不是为函数创建对象,为什么不使用循环。 你不会比那更有效率。 但是,如果您想要可读性而不是性能(并且大多数时候这是一个更好的主意),您可以找到function符号套件。

 List bars = new ArrayList(); for(Foo foo: foos) { // do some simple local transform of foo into a Bar. bars.add(bar); } 

就个人而言,我发现这更简单。