理解方法引用的本質
Java 8 的方法引用提供了一種方便的機制,可以透過名稱和參數來引用特定方法。但是,方法引用的執行涉及建立稱為 lambda 的匿名類別物件。快取此引用已被提議作為一種潛在的最佳化,引發了對其有效性的質疑。
方法引用快取機制
快取方法引用涉及儲存一個佔位符,以避免為每個函數呼叫重複建立匿名類別。但是,區分重複執行相同呼叫網站(呼叫方法引用的程式碼中的特定點)和重複使用對相同方法的方法引用(從不同的呼叫網站呼叫)至關重要。
JIT 編譯與方法引用最佳化
Java 虛擬機器(JVM)採用即時(JIT)編譯來在執行時間分析和最佳化程式碼。對於無狀態 lambda(沒有封裝狀態的參數),JVM 可以建立一個常數 lambda 物件來快取 invokedynamic 指令。同樣,對於靜態方法(也是無狀態的)的方法引用,JVM 可以最佳化快取。
狀態相關方法引用
但是,對於lambda 和方法引用使用封裝狀態的參數(稱為「有狀態lambda」),JVM 不太願意快取生成的lambda 實例。這是因為維護參數值和對應 lambda 實例之間的對應可能會帶來不必要的開銷。
特殊情況和最佳實踐
雖然方法引用緩存在在某些情況下,例如當在許多不同的調用站點使用對同一方法的引用時,通常不建議將其作為一般最佳實踐。應考慮 JVM 對無狀態 lambda 的最佳化以及與快取有狀態 lambda 相關的潛在開銷。
在認為需要快取的情況下,例如在建構函式中建立的有狀態 lambda 或由多個執行緒同時調用,應進行仔細的分析以驗證實際的效能影響。否則,建議依賴 JVM 的方法引用最佳化機制。
以上是我們應該在 Java 8 中緩存方法引用嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!