Кросенволду:
Я думаю, что вы не поняли моего намерения.Может быть, я должен быть более ясным.
Предположения состоят в том, что Tree и TreeBuilder находятся в одном пакете.
Как вы можете видеть, конструктор Tree и метод freeze () имеют package уровень доступа.Таким образом, вы не можете создать его вне пакета и также не можете заморозить его вне пакета.
Единственный способ сделать это - через метод build ().Только TreeBuilder может создавать Tree, используя синхронизированный метод сборки.
Теперь я даже понял, что вы можете даже упростить удаление флага readonly и изменение метода Tree.addChild () для создания видимости.Следовательно, вы получите дерево, которое не имеет общедоступных мутаторов, а только методы доступа.
Как я уже сказал, Дерево не синхронизируется.TreeBuilder - это место, где происходит ваша синхронизация.Присмотритесь к аксессорам и мутаторам.Посмотрите, где находятся модификаторы public и package, и вы увидите, что единственный способ изменить дерево - это когда вы находитесь в одном пакете, так что это может сделать только построитель дерева.
public class Tree<T extends Filterable>{
private final T data;
private Tree<T> parent;
private List<Tree<T>> children;
private List<FilterChain<T>> filterChain;
private boolean readonly = false;
/*package*/ Tree(T data) {...}
/*package*/ Tree(Tree<T> parent, T data) {...}
/*package*/ void addChild(Tree<T> child){
children.add(child);
}
public List<?> getResults(){
return data.returnResults(filterChain);
}
}
public class TreeBuilder<T>{
public synchronized TreeNode createRoot(T data);
public synchronized void addSubElement(TreeNode parentNode ,T data);
public synchronized void addFilter(TreeNode node, Filter<T> filter);
public Tree<T> synchronized build(){
Tree<T> tree= ...
//build your tree
//build filter chain for specific tree node
return tree;
}
}