如何创建一个完全不可变的树层次结构?建筑鸡和蛋
2022-09-01 20:35:45
我喜欢使数据类不可变,以使并发编程更容易。但是,建立一个完全不可变的层次结构似乎有问题。
考虑这个简单的树类:
public class SOTree {
private final Set<SOTree> children = new HashSet<>();
private SOTree parent;
public SOTree(SOTree parent) {
this.parent = parent;
}
public SOTree(Set<SOTree> children) {
for (SOTree next : children)
children.add(next);
}
public Set<SOTree> getChildren() {
return Collections.unmodifiableSet(children);
}
public SOTree getParent() {
return parent;
}
}
现在,如果我想创建这些节点的层次结构,那么当我构造它时,要么父节点必须在当前节点之前存在,要么子节点必须首先存在。
SOTree root = new SOTree((SOTree)null);
Set<SOTree> children = createChildrenSomehow(root);
//how to add children now? or children to the children?
或
Set<SOTree> children = createChildrenSomehow(null);
SOTree root = new SOTree(children);
//how to set parent on children?
在不强制它是一个单链接树的情况下,是否有任何聪明的方法来构造这样的树,并且仍然具有完全不可变的所有节点?