2015-01-03 15 views
1

我有一個BinarySearchTree實現,它實現如下接口Tree的公共insert方法。如何處理此類可見性問題?

public class BinarySearchTree<T extends Comparable<T>> implements Tree<T> { 
public boolean insert(T value) { 
Node<T> nodeInserted = insertValue(value); //call private method to insert. 
return (nodeInserted != null); 
} 

protected Node<T> insertValue(T value) { 
    //insert the node and then return it. 
} 

public Node<T> search(T value) { 
     //search and return node. 
    } 

    //Node class for BST 
    public static class Node<T extends Comparable<T>> { 
    // Fields and getters and setters. 
    } 
} 

的想法是,其他的派生類(例如AVL)樹將覆蓋方法insertValue爲: '

public class AVLTree<T extends Comparable<T>> extends BinarySearchTree<T> { 
@Override 
    protected Node<T> insertValue(T id) { 
     //specific code to insert node in AVL 
    } 

// AVL Node 
    public static class AVLNode<T extends Comparable<T>> extends Node<T> { 
    // Fields and getters/ setters 
    } 
} 

現在我有另一個類TreeMap中其可以使用RB樹或AVL來實現樹。我想重新使用AVL的代碼:

public class TreeMap<K extends Comparable<K>, V> implements Map<K,V> { 
    private AVLTree<K> tree = null; 

    @Override 
    public V put(K key, V value) { 
    //Here is the problem. 
    } 
} 

的問題是:我要插入關鍵屬性爲AVL樹中的節點,然後需要獲得插入節點的保持和做一些處理工作。我既不能覆蓋也不能獲得AVLTree類的insertValue()。

一個選項它調用插入方法並獲得布爾結果。檢查它是否爲真,然後再次調用搜索方法來獲取節點,然後進行處理。有沒有其他更好的解決方案來解決這個問題?

我還需要一個建議。我已將類別Node聲明爲僅與BST有關。我需要AVL的另一個節點類,並考慮擴展靜態類節點。爲了讓Node在另一個包中可見,我不得不聲明公共,以便它可用於AVLNode。有沒有任何設計問題?

回答

0

如果insert返回null而不是false而找到的節點而不是true?然後您將能夠一次性返回這兩個信息。更好的想法是返回Optional<T>

對於第二個問題,實際上我發現奇怪的是從另一個類的靜態內部類擴展Node。你說Node只關注BST,但如果你在AVL需要它,情況並非如此,所以你最好有BST.NodeAVL.Node兩個單獨的類或一個接口/抽象類擴展。

+0

節點的一個對象應該與BinarySearchTree密切相關,這就是爲什麼它是靜態嵌套類。 AVLTree也需要也是Node的節點類,所以我發現它適合於擴展Node。 如果Node受到保護,我無法在AVLTree定義的其他包中看到它,所以必須公開它。然後它擴展了靜態嵌套類節點。 恕我直言,我相信我們沒有Java中的靜態內部類。我們不? –

+0

這樣使用,我不知道,但否則它是一個相當普遍的事情:Map.Entry(公共接口),HashMap.Node(用作實現細節的私有類),Rectangle2D.Double和Rectangle2D.Float(public ,用於提供雙精度和浮點精度相同的功能)...在你的情況下,我感到困擾的是它似乎是一個實現細節,所以我不希望它是公開的 – Dici

+0

我認爲使用Node就像一個私人靜態類只作爲HashMap中的Node類。現在AVLNode也是Node,所以我想擴展Node類,但如果它是私有的(或保護的),它將不能用於某些其他包中的派生類AVLTree。 所以即使我想不出任何其他整潔的解決方案。 –