什么是后继价值模式

时间:2013-09-25 08:19:41

标签: scala design-patterns

我正在阅读scala in action(manning edition),并且有一个关于此模式的章节,其中包含一个代码示例:

class PureSquare(val side: Int) {
def newSide(s: Int): PureSquare = new PureSquare(s)
def area = side * side
}

这本书有一个链接应该解释模式。不幸的是,链接被破坏了,我找不到它。

是否有人能够解释这种模式以及这段代码应该如何工作?

因为我在调用区域函数时没有看到如何调用newSide。

谢谢

1 个答案:

答案 0 :(得分:5)

您是对的:newSide不会直接更改area,但会创建一个长度不同PureSquare的新side

这是为了展示如何使用纯粹的功能性对象(没有可变的内部状态),同时满足在我们的程序中进行更改的需要

使用此模式您创建的任何对象在技术上仍然是 immutable ,但您可以通过调用正确的方法(在本例中为newSide)来“模拟”更改对象

一个值得100个解释的例子

val square1 = new PureSquare(1)
assert(square1.area == 1)

//this is similar to changing the side of square1
val square2 = square1.newSide(2)

//and the area changes consequently
assert(square2.area == 4)
//while the original call is still referentially transparent [*]
assert(square1.area == 1)

[*] http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)