假設我們有以下的情況下類:緩存斯卡拉案例類實例
abstract sealed class Tree
case class Leaf(i: Int) extends Tree
case class Node(left: Tree, right: Tree) extends Tree
每次我們調用的情況下類的構造函數,一個新的對象在內存中創建。例如,在下面的代碼:
val a = Leaf(0)
val b = Leaf(0)
a和b點不同的對象存儲:
a == b // true
a eq b // false
我想覆蓋的情況下階層的「應用」的方法,使他們如果它已經存在,則返回一個緩存的對象,以便在上面的最小示例中,「a eq b」將返回true。
我在#1發現這兩個相關答案:
How to override apply in a case class companion(演示如何重寫 「應用」 方法)
Why do each new instance of case classes evaluate lazy vals again in Scala?(顯示了一個簡單的方法來緩存案例類的實例)
我計劃執行我的壓倒一切的「應用」方法與它結合了兩種方法ABO鏈接的方式緩存五個。但我想知道是否有其他方法可以考慮。如果你知道的話,可否請你在這裏分享你的解決方案? case類的
緩存實例似乎是做,以減少內存消耗一個非常有用的和自然的事情。然而,我打算實施的解決方案(基於上面鏈接的兩個答案)看起來相當複雜,需要大量的樣板代碼,這會損害案例類的優雅和簡潔。有誰知道,如果未來版本的Scala語言可能允許我們通過這樣寫簡單的東西來實現案例類實例緩存:
abstract sealed class Tree
cached case class Leaf(i: Int) extends Tree
cached case class Node(left: Tree, right: Tree) extends Tree
??
只是一個隨機問題,你看過這個「緩存」作爲任何其他語言的核心功能嗎?至少我還沒有遇到它。 –
我也沒有。這讓我懷疑是否有這個原因。 @Alexey Romanov的回答下面指出了一些有趣的原因。 – Bruno