随着 Scala 等编程语言对不变性的强调(避免“var”),这是否意味着我的对象中的“状态修改方法”必须返回实例的副本(具有新状态)?
让我们考虑乌龟。我想像这样移动我的乌龟:
val turtle = new Turtle(0, 0, "north")
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2)
这里的turtle2 不会指向Turtle 的同一个实例(它们是两个独立的实例)。事实上,在这一系列 Action 中,创建了 4 个临时对象。这就是我将如何实现方法 turnLeft,例如:
def turnLeft {
self.copy(orientation = self.orientation match {
case "north" => "west"
case "east" => "north"
case "south" => "east"
case "west" => "south"
})
}
这是正确的设计方法吗?
如果是,那么效率/低效如何(在每次方法调用时创建新对象)?
如果不是,那什么是正确的?我对不变性方面(或者一般来说可能是函数式编程)的理解有什么错误/缺失?
提前致谢,
拉卡
最佳答案
创建大量的短期对象是 Scala 的一个标志性特征。它通常不会很昂贵,只要您在具有足够大小的堆的 JVM 上运行它,并有足够数量的年轻代内存来容纳所有的流失。
话虽如此,不变性不是一种宗教。常识应该占上风,并在坚持“范式”变得过于费力的情况下指导设计决策。
关于scala - 不变性设计(在 Scala 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27761429/