B树实现 - 我应该将Node类作为静态成员类吗?

时间:2010-08-17 15:07:40

标签: java data-structures b-tree

我需要为大学实施B-Tree:

我有一个“外部”类B-Tree,其属性为 root 和_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类实现为静态成员类时,我无法访问外部类的degree属性。

现在我必须做出选择:

  1. 使Node类成为内部类(非静态成员类)或
  2. 为Node类创建一个构造函数,并在每次需要构建Node时传递度。
  3. 最佳选择是什么?使它成为一个内部类意味着节点都会引用Btree(外部类),但是使它成为静态成员类意味着我必须每次都通过该程度。

3 个答案:

答案 0 :(得分:4)

我会保持静态并通过学位。这样您就可以确保Node无法了解有关BTree的任何详细信息。

答案 1 :(得分:1)

如果是我,我会将Node类公开,所以我可以在其他包含数据结构中重用它,但那只是我。在那种情况下,我必须通过构造函数传递学位,这对我也没问题。我不喜欢内部类操纵封闭类成员的想法。我觉得这使得课程彼此紧密联系。我知道有时这是合适的,但是我可以避免,这似乎是一个容易避免的案例。

答案 2 :(得分:1)

有一些参数使它成为静态的,因为它将类分离。

但我认为BTree.Node是来自特定BTree的节点。去创建一堆节点(随机度)是没有意义的。你不能拥有一个Node,但没有Tree。因此,我说非静态。