2010-08-17 90 views
1

我需要實現一個B-Tree的大學:B-Tree的實現 - 我應該讓Node類是一個靜態成員類還是不是?

我有一個 「外」 類的B-Tree與屬性和_degree。代表節點的類作爲一個靜態成員類實現:

public class BTree<E> { 
    private Node<E> root; 
    // the minimal degree 
    private int degree; 

    public BTree(int degree) { 
     if (degree < 2) { 
      throw new IllegalArgumentException(); 
     } 

     this.degree = degree; 
    } 

    // other stuff 

    private static class Node<T> { 
     T[] elements  = (T[])new Object[degree * 2 - 1]; 
     Node<T>[] children = (Node<T>[])new Object[degree * 2]; 
     int size   = 0; 
    } 
} 

所以,現在我的問題是:當我實現了Node類的靜態成員類,我無法訪問的程度屬性外部類。

現在我必須選擇:

  1. 使Node類的內部類(非靜態成員類)或
  2. 爲節點創建類的構造,並通過在每一個我需要時間度構建一個節點。

什麼是最佳選擇?使它成爲內部類將意味着節點都將引用Btree(外部類),但將它作爲一個靜態成員類將意味着我必須每次都通過該學位。

+0

Node是否需要內部類?你有沒有改變BTree設計的自由? – athena 2010-08-17 15:30:49

+0

@athena我有自由,但我喜歡使用嵌套類來增加封裝^^。 – helpermethod 2010-08-17 15:48:22

回答

4

我會保持它靜態並通過度。這樣,你確保Node不知道關於BTree的任何細節。

1

如果是我,我會公開Node類,所以我可以在其他包含數據結構中重用它,但這只是我。在那種情況下,我必須通過構造函數來通過學位,對我來說也沒關係。我不喜歡內部類操作封閉類的成員的想法。我覺得這會讓班級彼此緊緊相連。我知道有時候這是合適的,但我會盡量避免,而且這似乎是一個容易避免的情況。

1

有一些參數使其成爲靜態的,因爲它解耦了類。

但我認爲BTree.Node是來自特定BTree的節點。去創建一堆節點(隨機度)是沒有意義的。你不能有一個節點,但不能有樹。因此,我說非靜態的。

相關問題