Note that there are some explanatory texts on larger screens.

plurals
  1. POExtendable double-linked tree implementation in Java
    primarykey
    data
    text
    <p>I want to extend an existing double-linked tree implementation by some extra data. </p> <p>Therefor I could refactor the basic <code>TreeNode</code> implementation, but I want to have a separate extended TreeNode implementation, because in my real-world szenario building-up an <code>ExtandedTreeNode</code> will be much more expensive than building-up the basic <code>TreeNode</code>, and the extra data is only necessary for some use-cases.</p> <h1>Rudimental Code</h1> <p>Here my first rudimental approach for an extendable double-linked tree implementation in Java:</p> <h2>Basic tree node interface:</h2> <pre class="lang-java prettyprint-override"><code>interface TreeNode { // tree node getters: TreeNode getParent(); List&lt;? extends TreeNode&gt; getChildren(); // tree node setters: void setParent(TreeNode parentNode); void addChild(TreeNode childNode); // some basic operations: boolean isSelectable(); // [...] } </code></pre> <h2>Extended tree node interface:</h2> <pre class="lang-java prettyprint-override"><code>interface ExtandedTreeNode extends TreeNode { // narrow types of tree node getters of super-interface: @Override ExtandedTreeNode getParent(); @Override List&lt;? extends ExtandedTreeNode&gt; getChildren(); // narrowing types of tree node setters of super-interface is not possible! // some additional operations: boolean isRemoveable(); // [...] } </code></pre> <h2>Basic tree node implementation:</h2> <pre class="lang-java prettyprint-override"><code>class TreeNodeImpl implements TreeNode { private TreeNode parent; private List&lt;TreeNode&gt; children = new ArrayList&lt;TreeNode&gt;(); private boolean isSelectable; // // implement tree node getters: // @Override public TreeNode getParent() { return parent; } @Override public List&lt;? extends TreeNode&gt; getChildren() { return children; } // // implement tree node setters: // @Override public void setParent(TreeNode parent) { this.parent = parent; } @Override public void addChild(TreeNode childNode) { children.add(childNode); } // // implement basic operations: // @Override public boolean isSelectable() { return isSelectable; } // [...] } </code></pre> <h2>Extended tree node implementation:</h2> <pre class="lang-java prettyprint-override"><code>class ExtandedTreeNodeImpl implements ExtandedTreeNode { private ExtandedTreeNode parent; private List&lt;ExtandedTreeNode&gt; children = new ArrayList&lt;ExtandedTreeNode&gt;(); private TreeNode treeNode; private boolean isRemoveable; public ExtandedTreeNodeImpl() { treeNode = new TreeNodeImpl(); } // // implement tree node getters: // @Override public ExtandedTreeNode getParent() { return parent; } @Override public List&lt;? extends ExtandedTreeNode&gt; getChildren() { return children; } // // implement tree node setters: // @Override public void setParent(TreeNode parent) { this.parent = (ExtandedTreeNode) parent; // &lt;--- How to avoid this type cast!! } @Override public void addChild(TreeNode childNode) { children.add((ExtandedTreeNode) childNode); // &lt;--- How to avoid this type cast!! } // // implement basic operations by delegating to composite TreeNode: // public boolean isSelectable() { return treeNode.isSelectable(); } // [...] // // implement additional operations: // @Override public boolean isRemoveable() { return isRemoveable; } // [...] } </code></pre> <h2>Question</h2> <p>For me the type hierarchy looks great for the read-only and non-tree-node-specific methods, but it leaks for the setters <code>setParent(..)</code> and <code>addChild(..)</code>. Particularly the risky typecast to <code>ExtandedTreeNode</code> is quite evil and I want to get rid of it. </p> <p>I thought about extracting the <code>setParent(..)</code> and <code>addChild(..)</code> methods to another two separate Interfaces like <code>TreeNodeWriteable</code> and <code>ExtandedTreeNodeWriteable</code>, but maybe there are some better design solutions. </p> <p>Does anyone know a design pattern or blue print which could solve my problem with the writeable tree-node-specific setters?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload