scala – 不变性和共享参考 – 如何调和?
考虑这个简化的应用程序域:
刑事调查数据库 Domain http://yuml.me/13fc6da0 如果这些存储在某种数据库中,并且我希望使用不可变对象,那么在状态和引用方面似乎有一个问题. 假设我更改了一些关于Person的元数据.由于我的Person对象是不可变的,我可能会有一些代码,如: class Person( val id:UUID,val aliases:List[String],val reports:List[Report]) { def addAlias(name:String) = new Person(id,name :: aliases,reports) } 所以我的人有一个新的别名成为一个新的对象,也是不可变的.如果一个报告指的是这个人,但这个别名是在系统其他地方改变的,那么我的报告现在提到“老”的人,即没有新别名的人. 同样,我可能会: class Report(val id:UUID,val content:String) { /** Adding more info to our report */ def updateContent(newContent:String) = new Report(id,newContent) } 由于这些对象不知道谁提及他们,所以我不清楚如何让所有的“推荐人”知道有一个新的对象可用代表最近的状态. 这可以通过将所有对象从中央数据存储区“刷新”并将创建新的,更新的对象的所有操作存储到中央数据存储中来实现,但这感觉像是对基础语言的引用的粗俗重新实现.即,使这些“次要可存储物体”变得可变更清楚.所以,如果我添加一个别名给一个人,所有引用者都看到新的值,而不做任何事情. 当我们想要避免可变性时,这是如何处理的,还是这种不可变性没有帮助的情况? 解决方法
如果X指Y,两者都是不可变的,Y变化(即用更新的副本替换),那么你别无选择,只能替换X(因为它已经改变,因为新的X指向新的Y,不是老的)
维护高度互联的数据结构时,这很快就变得头痛.你有三种一般方法. >一般忘记不变性使链接变得可变.根据需要修复它们.确保你真的修复它们,或者你可能会收到内存泄漏(X指的是旧的Y,它指的是旧的X,它指的是较旧的Y等). 哪个是最好的取决于你查找和更新的速度,我期望. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |