La mise en œuvre B-Tree - je vais faire la classe Node une classe membre statique ou non?
-
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:
- Ajouter la classe Node une classe interne (classe de membre non-statique) OR
- 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.
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.