java—vavr集合真的持久吗

b4lqfgs4  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(329)

在本文中,我理解persistent是指在试图修改集合时保留集合的早期版本:

List<Integer> l = List.of(1, 2, 3);
List<Integer> l2 = l.append(4);

但是,如果我失去了参考 l 对于原始集合,我在l2上看不到任何允许我访问原始集合的方法?有了持久的收藏,我会想到:

l2.getPreviousVersion()

也许我没抓住重点?

vmdwslir

vmdwslir1#

所有vavr集合都是持久的。没有api方法可以使vavr集合发生变异。这意味着,一旦持有对vavr集合的引用,就可以确保它不会被代码的任何部分更改(1)。
api中缺少的实际上是一个问题,而不是一个特性。如果您可以查询api以获取集合的所有早期版本,则意味着您将所有早期版本都保留在内存中。这将是一个巨大的资源浪费,这将使收集远不如他们有用。当前,如果您不持有对集合的早期版本的引用,则允许垃圾收集器释放旧版本使用的内存。
如果您想了解某个集合的某种演化历史,就必须让代码负责保存和逐出对这些集合的引用。这样您就可以完全控制程序的内存使用。
(1) 除了使用反射或类似工具的黑客,这些工具允许您绕过封装直接修改字段/内存

相关问题