Это хорошая идея, чтобы сохранить конструктор простым.В вашем случае это сложно, взаимодействуя с другим объектом.Одной из причин является обработка ошибок, которая может быть сложной в конструкторах.
Вместо использования конструктора с параметром удалите параметр и вызовите его следующим образом.
var newBody = new Body();
newBody.setParent(parent);
Конструктор будет выглядеть такthis.
public Body() {
this.children = new TreeSet<Body>;
}
И измените метод setParent для проверки отсутствия текущего родителя.
public synchronized void setParent(Body newParent) {
if (parent != null)
parent.removeChild(this);
parent = newParent;
if (newParent != null)
newParent.addChild(this);
}
Обратите внимание, что я также изменил имя параметра setParent, чтобы он не конфликтовал с переменной класса,Трудно найти ошибки, возникающие, когда вы забываете использовать «this» для того, чтобы отличить, на какого «родителя» вы ссылаетесь.
Код конструктора, который я удалил, на самом деле был просто дублированием метода setParent.
Я добавил синхронизированный метод, чтобы вы были уверены, что несколько вызовов этого метода выполняются синхронно, в противном случае иерархия может быть повреждена.
Конечно, есть много способов сделать это.Но это простой способ, который я бы использовал.