Правильный подход для построения неизменяемого дерева состоял бы в том, чтобы конструктор каждого узла вызывал конструкторы дочерних узлов с самим собой в качестве параметра, при условии, что конструктор дочернего узла не должен вызывать корневую ссылку на себя, чтобы быть хранится в любом месте и не использует передаваемый параметр для каких-либо целей, кроме как для инициализации поля, которое конструктор будет использовать ни для чего, кроме как для принятия такой инициализации. Кроме того, конструктор родительского узла должен избегать использования каких-либо членов дочернего узла, которые разыменовывают поле «родитель».
Хотя такая методика может показаться нарушающей правило, согласно которому конструкторы неизменяемых объектов не должны превращаться в опорные объекты в качестве параметров других подпрограмм, «реальное» правило состоит в том, что конструктор неизменяемого объекта не должен допускать ссылку на fledgeling объект, который будет использоваться таким образом, чтобы прямо или косвенно получить доступ к любым полям, которые еще не достигли своего окончательного значения. В общем, если объект-заменитель предоставляет ссылку на себя для внешнего мира, он не будет иметь никакого контроля над тем, что внешний код может с ним делать. В конкретном случае вызова конструктора дочернего узла, однако, при условии, что код для дочернего узла удовлетворяет вышеуказанным требованиям, не будет никакой корневой ссылки на родительский узел, , кроме как через сам родительский узел . Следовательно, не будет никакой опасности, что любой код, который сделает что-то неожиданное с оперирующим узлом, получит ссылку на него.