不可变对象下面特别 方便用于实现某些共同 成语如撤消/重做,可中止 交易。以撤消为例。 A 用于实现撤销 的常用技术是保持一堆对象,该对象以某种方式知道如何以反向方式运行每个命令 (所谓的“命令 模式”)。然而,弄清楚如何 反向运行一个命令可以是 棘手。更简单的技术是在连续的命令之间维护表示系统 的状态的不可变对象堆栈 。然后, 撤消命令,你只需恢复 到以前的系统状态(和 可能存储在 重做堆栈中的当前状态)。
不管怎样,文章并没有展示一个很好的实例,说明如何使用不可变对象来实现“撤消”操作。例如...从Gmail收件箱中删除10封电子邮件。一旦你这样做,它有一个撤消选项。在这方面,不可变对象将如何提供帮助?
“Gmail收件箱太大而无法使用此技术”。伊什。如果实际消息是单独的对象,并且两个不同的收件箱对象引用相同的消息,则收件箱只是一个列表,您可能可以这样做。关于不可变对象的另一件好事是对象可以像这样安全地共享资源。使用可变对象时,您可能不得不担心对另一个中出现错误的变化。 – 2009-11-28 18:03:54
这是一个很好的观点。我注意到,对于GMail帐户,适当的不可变对象将是每个标签的标签列表和电子邮件对象的关联列表;这比整个存档小得多,但比收件箱邮件列表大得多。 – jprete 2009-11-30 18:49:53