我正在评估Scala,并且我的不可变集合存在问题。
我想制作完全不可变的不可变集合,直到所有包含的对象,它们引用的对象,无限制地。
有一种简单的方法吗?
http://www.finalcog.com/immutable-containers-scala上的代码说明了我想要实现的目标,以及令人讨厌的工作(ImmutablePoint)。
解决方法的问题是,每次我想要更改对象时,我都必须手动创建新副本。我知道运行时必须实现copy-on-write,但这对开发人员来说是否透明?
我想我正在制作不可变对象,其中方法改变当前对象状态,但对象的所有其他'val'(以及所有不可变容器)引用都保留“旧”状态。
答案 0 :(得分:9)
这不可能通过某种特定的语言构造与scala开箱即用,除非你已经遵循了对象的所有不可变的习语,在这种情况下这种行为是免费的!
对于2.8,从可读性的角度来看,命名参数使得“复制构造函数”非常好用。但你是对的,这可以作为写时复制。您要求的行为,“当前”对象是唯一一个变异的对象完全违背了JVM的工作方式,不幸的是(对您而言)!
实际上,短语“当前对象”毫无意义;你的意思是“当前参考”!所有其他引用(在当前词法范围之外)指向同一个对象,erm,指向同一个对象! 只有一个对象!
因此,从当前词汇范围的角度来看,这个对象似乎不可能是可变的,但对其他人而言是不可变的
答案 1 :(得分:2)