1

大学のBツリーを実装する必要があります。

root属性と_degree属性を持つ「外部」クラスのBツリーがあります。ノードを表すクラスは、静的メンバークラスとして実装されます。

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クラスを内部クラス(非静的メンバークラス)にするOR
  2. Nodeクラスのコンストラクターを作成し、Nodeを構築する必要があるたびに学位を渡します。

最良の選択は何でしょうか?これを内部クラスにすると、ノードはすべてBtree(外部クラス)への参照を持つことになりますが、静的メンバークラスにすると、毎回学位を渡す必要があります。

4

3 に答える 3

4

私はそれを静的に保ち、学位を渡します。そうすれば、あなたはNodeそれについての詳細を知ることができないことを保証しますBTree

于 2010-08-17T15:13:17.097 に答える
1

クラスを分離するため、静的にするための引数があります。

しかし、BTree.Nodeは特定のBTreeのノードだと思います。たくさんのノードを(ランダムな程度で)作成するのは意味がありません。ノードを持つことはできませんが、ツリーを持つことはできません。したがって、私は非静的と言います。

于 2010-08-17T19:09:15.040 に答える
1

私の場合、Nodeクラスをパブリックにして、他の含まれているデータ構造で再利用できるようにしますが、それは私だけです。その場合、コンストラクターを介して学位を渡す必要がありますが、それは私にとっても問題ありません。内部クラスが囲んでいるクラスのメンバーを操作するという考えは好きではありません。クラス同士の結びつきが強すぎる気がします。私は時々それが適切であることを知っています、しかし私はできるときは避けます、そしてこれは簡単に避けられるケースのようです。

于 2010-08-17T15:13:31.213 に答える