有没有人知道一个库或至少一些有关在Java中创建和使用持久性数据结构的研究?我不是将持久性称为长期存储,而是将持久性称为不变性(请参阅Wikipedia条目)。
我目前正在探索为持久性结构建模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();
但这仍然感觉有些呆板。有任何想法吗?
我想显而易见的选择是:
o切换到临时数据结构(构建器)进行更新。这是很正常的。StringBuilder用于String操纵例如。举个例子。
StringBuilder
String
Person p3 = Builder.update(p) .withAddress( Builder.update(p.address()) .withCity("Berlin") .build() ) .build();
o始终使用持久性结构。尽管似乎有很多复制,但实际上您应该共享几乎所有状态,因此它远没有看起来那么糟糕。
final Person p3 = p .withAddress( p.address().withCity("Berlin") );
o将数据结构分解为大量变量,并与一个庞大且令人困惑的构造函数重新组合。
final Person p3 = Person.of( p.name(), Address.of( p.house(), p.street(), "Berlin", p.country() ), p.x(), p.y(), p.z() );
o使用回调接口提供新数据。甚至更多样板。
final Person p3 = Person.of(new PersonInfo( public String name () { return p.name(); ) public Address address() { return Address.of(new AddressInfo() { private final Address a = p.address(); public String house () { return a.house() ; } public String street () { return a.street() ; } public String city () { return "Berlin" ; } public String country() { return a.country(); } })), public Xxx x() { return p.x(); } public Yyy y() { return p.y(); } public Zzz z() { return p.z(); } });
o使用讨厌的技巧使字段暂时可用于代码。
final Person p3 = new PersonExploder(p) {{ a = new AddressExploder(a) {{ city = "Berlin"; }}.get(); }}.get();
(非常有趣的是,我刚刚放下了Chris Okasaki的“纯功能数据结构”的副本。)