【发布时间】:2016-11-14 06:06:29
【问题描述】:
假设我们有以下案例类:
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
我想重写案例类的“apply”方法,让它们返回一个缓存对象,以防它已经存在,这样,在上面的最小示例中,“a eq b”将返回 true。
我在 Stackoverflow 中找到了这两个相关的答案:
How to override apply in a case class companion(显示如何覆盖“应用”方法)
Why do each new instance of case classes evaluate lazy vals again in Scala?(展示了一种缓存案例类实例的简单方法)
我计划以结合上面链接的两种方法的方式实现我的覆盖“应用”方法和缓存。但我想知道是否有其他方法可以考虑。如果您知道,可以在这里分享您的解决方案吗?
缓存案例类的实例似乎是减少内存消耗的一件非常有用且自然的事情。然而,我计划实施的解决方案(基于上面链接的两个答案)似乎相当复杂,需要大量样板代码,这会损害案例类的优雅和简洁性。有谁知道未来版本的 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 下面的回答指出了一些有趣的原因。
标签: scala caching case-class