La mise en œuvre B-Tree - je vais faire la classe Node une classe membre statique ou non?

StackOverflow https://stackoverflow.com/questions/3503922

  •  29-09-2019
  •  | 
  •  

Question

Je dois mettre en œuvre un B-Tree pour l'Université:

J'ai une classe "externe" B-Tree avec des attributs root et _degree. La classe pour représenter les noeuds est mis en oeuvre en tant que classe statique membre:

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;
    }
}

Alors, maintenant mon problème est:. Comme je l'ai mis en œuvre la classe Node comme une classe membre statique, je ne peux pas accéder à l'attribut degré de la classe externe

Maintenant, je dois choix:

  1. Ajouter la classe Node une classe interne (classe de membre non-statique) OR
  2. Créez un constructeur pour la classe Node et passer le diplôme en chaque fois que je dois construire un nœud.

Quel serait le meilleur choix? Ce qui en fait une classe interne signifierait que les nœuds seraient tous une référence à la Btree (classe externe), mais ce qui en fait une classe membre statique signifierait que je devrais passer le degré dans tous les temps.

Était-ce utile?

La solution

Je garderais statique et passer de degré. De cette façon, vous vous assurez que Node ne peut pas connaître les détails sur BTree.

Autres conseils

Si elle était moi, j'aurais le public de classe Node pour que je puisse le réutiliser dans d'autres contenant des structures de données, mais c'est juste moi. Dans ce cas, je dois passer le degré par le constructeur, et c'est OK avec moi aussi. Je n'aime pas l'idée de classes internes manipuler les membres des classes enserrant. Je pense qu'il fait les classes liées trop étroitement les uns aux autres. Je sais que parfois il est approprié, mais j'éviter quand je peux et cela semble un cas facilement évitable.

Il existe des arguments pour le rendre statique, car il découple les classes.

Mais je pense qu'un BTree.Node est un nœud d'un BTree particulier. Il n'a pas de sens d'aller et de créer un groupe de noeuds (avec des degrés aléatoires). Vous ne pouvez pas avoir un nœud, mais pas d'arbre. Ainsi, je dis non statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top