问题描述
在这种情况下,我将持久性理解为在尝试修改集合时保留以前版本的集合:
List<Integer> l = List.of(1,2,3);
List<Integer> l2 = l.append(4);
但是,如果我丢失了对原始集合的引用 l
,我在 l2 上看不到任何允许我访问原始集合的方法?使用我期望的持久集合:
l2.getPrevIoUsversion()
也许我没抓住重点?
解决方法
所有 vavr 集合都是持久的。没有 API 方法可以改变 vavr 集合。这意味着,一旦您持有对 vavr 集合的引用,您就可以确定它不会被代码的任何部分更改(1)。
您在 API 中缺少的实际上是问题而不是功能。如果您可以查询集合的所有先前版本的 API,则意味着您将所有先前版本保留在内存中。那将是对资源的巨大浪费,并且会使收藏品的用处大大降低。目前,如果您不持有对先前版本集合的引用,则允许垃圾收集器释放旧版本使用的内存。
如果您想要某种集合演变的历史,您必须让代码负责保持和清除对这些集合的引用。这样您就可以完全控制程序的内存使用。
(1) 使用反射或类似工具的黑客,允许您直接修改字段/内存,绕过封装
,保留以前的版本不是直接有意的功能。
这是不变性的结果。正如图灵85所说,访问以前的版本是完全持久化数据结构的一个特性。