有谁知道关于在 Java 中创建和使用持久数据结构的库或至少一些研究吗?我并不是将持久性称为长期存储,而是将持久性称为不变性(请参阅维基百科条目 http://en.wikipedia.org/wiki/Persistent_data_structure).
我目前正在探索为持久结构建模 api 的不同方法。使用构建器似乎是一个有趣的解决方案:
// create persistent instance
Person p = Builder.create(Person.class)
.withName("Joe")
.withAddress(Builder.create(Address.class)
.withCity("paris")
.build())
.build();
// change persistent instance, i.e. create a new one
Person p2 = Builder.update(p).withName("Jack");
Person p3 = Builder.update(p)
.withAddress(Builder.update(p.address())
.withCity("Berlin")
.build)
.build();
但这仍然感觉有些陈词滥调。有任何想法吗?
构建器将使您的代码过于冗长而无法使用。在实践中,我见过的几乎所有不可变数据结构都是通过构造函数传递状态的。就其价值而言,这里有一系列不错的文章,描述了 C# 中的不可变数据结构(应该很容易转换为 Java):
- 第 1 部分:不变性的种类 http://blogs.msdn.com/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx
- 第 2 部分:简单的不可变堆栈 http://blogs.msdn.com/ericlippert/archive/2007/12/04/immutability-in-c-part-two-a-simple-immutable-stack.aspx
- 第 3 部分:协变不可变堆栈 http://blogs.msdn.com/ericlippert/archive/2007/12/06/immutability-in-c-part-three-a-covariant-immutable-stack.aspx
- 第 4 部分:不可变队列 http://blogs.msdn.com/ericlippert/archive/2007/12/10/immutability-in-c-part-four-an-immutable-queue.aspx
-
第 5 部分:哈哈! http://blogs.msdn.com/ericlippert/archive/2007/12/13/immutability-in-c-part-five-lolz.aspx(为了完整性而包含在内)
- 第 6 部分:简单二叉树 http://blogs.msdn.com/ericlippert/archive/2007/12/18/immutability-in-c-part-six-a-simple-binary-tree.aspx
- 第 7 部分:有关二叉树的更多信息 http://blogs.msdn.com/ericlippert/archive/2007/12/19/immutability-in-c-part-seven-more-on-binary-trees.aspx
- 第 8 部分:更多关于二叉树的信息 http://blogs.msdn.com/ericlippert/archive/2008/01/18/immutability-in-c-part-eight-even-more-on-binary-trees.aspx
- 第 9 部分:AVL 树实现 http://blogs.msdn.com/ericlippert/archive/2008/01/21/immutability-in-c-part-nine-academic-plus-my-avl-tree-implementation.aspx
- 第 10 部分:双端队列 http://blogs.msdn.com/ericlippert/archive/2008/01/22/immutability-in-c-part-10-a-double-ended-queue.aspx
- 第 11 部分:工作双端队列实现 http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx
C# 和 Java 非常冗长,因此这些文章中的代码相当可怕。我建议学习 OCaml、F# 或 Scala,并熟悉这些语言的不变性。一旦掌握了该技术,您将能够更轻松地将相同的编码风格应用于 Java。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)