2010-08-17 17 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的节点。去创建一堆节点(随机度)是没有意义的。你不能有一个节点,但不能有树。因此,我说非静态的。

相关问题