Мне нравится делать классы данных неизменяемыми, чтобы упростить параллельное программирование. Но создание полностью неизменяемой иерархии кажется проблематичным.
Рассмотрим этот простой древовидный класс:
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;
}
}
Теперь, если я хочу создать иерархию из них, когда я его построю, либо родитель должен существовать до текущего node, либо дети должны сначала существовать.
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?
Не заставляя это быть единственным связанным деревом, есть ли какой-нибудь умный способ построить такое дерево и все же все узлы будут полностью неизменными?