VAVR 集合是否真的持久

问题描述

在这种情况下,我将持久性理解为在尝试修改集合时保留以前版本的集合:

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所说,访问以前的版本是完全持久化数据结构的一个特性。