假设我们有以下的情况下类:缓存斯卡拉案例类实例
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