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中文網其他相關文章!