Java 8 中的方法引用缓存
Java 8 引入了方法引用,它为引用实例方法和构造函数提供了简洁的语法。然而,人们担心缓存这些引用是否有益。要理解本主题,必须区分针对同一调用站点频繁执行的缓存方法引用和针对不同调用站点多次使用方法引用而缓存方法引用。
方法引用缓存对于相同的调用站点
考虑以下代码,其中通过 doSomethingWithAFunc() 重复调用 Foo.func():
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
缓存 this::func 应该会消除每次执行 hotFunction() 时都会创建新的匿名类实例。但是,JVM 已经通过重用首次调用 lambda 期间创建的调用站点实例来优化此场景。在这种情况下缓存方法引用是多余的。
不同调用站点的方法引用缓存
相反,请考虑以下示例:
Runnable r1 = System::gc; Runnable r2 = System::gc;
这里,两个不同的调用站点生成对 java.lang.System 中同一目标方法 System.gc() 的方法引用。 JVM 可以在它们之间共享单个 lambda 实例,但 Java 8 中的当前实现不这样做。这是由于维护 lambda 实例缓存的性能优势不确定。
最佳实践
考虑到这些因素,通常不建议缓存方法引用,除非有是通过测量确定的具体绩效问题。缓存可能会改变程序的执行行为,仅在以下情况下才应考虑:
当lambda 在构造函数或类初始化中创建,并且:
以上是Java 8 中的方法引用缓存是否可以提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!