2010-08-17 4 views
1

je dois mettre en œuvre un B-Tree pour l'Université:Implémentation B-Tree - dois-je faire de la classe Node une classe membre statique ou pas?

J'ai une classe B-Tree "extérieur" avec des attributs racine et _degree. La classe pour représenter les nœuds est mis en œuvre 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; 
    } 
} 

Donc, maintenant mon problème est: Comme je l'ai mis en œuvre la classe Node en tant que classe membre statique, je ne peux pas accéder à l'attribut degré de la classe extérieure.

Maintenant, je dois choix:

  1. Faire la classe Node une classe interne (classe membre non statique) OU
  2. Créez un constructeur pour la classe Node et passer le diplôme en chaque fois que je besoin pour construire un noeud.

Quel serait le meilleur choix? En faire une classe interne signifierait que les nœuds auraient tous une référence au Btree (classe externe), mais en faisant une classe membre statique, cela signifierait que je devrais passer le degré à chaque fois.

+0

Est-il nécessaire que Node soit une classe interne? Avez-vous la liberté de changer le design du BTree? – athena

+0

@athena J'ai la liberté mais j'aime utiliser des classes imbriquées pour encapsuler davantage ^^. – helpermethod

Répondre

4

Je voudrais le garder statique et passer degré. De cette façon, vous vous assurer que Node ne peut pas savoir tous les détails sur BTree.

1

Si c'était moi, j'aurais la classe publique Node afin que je puisse le réutiliser dans d'autres structures de données contenant, mais c'est juste moi. Dans ce cas, je devrais passer le degré par le constructeur, et c'est OK avec moi aussi. Je n'aime pas l'idée que les classes internes manipulent les membres des classes qui les entourent. Je pense que cela rend les classes trop étroitement liées les unes aux autres. Je sais parfois que c'est approprié, mais j'évite quand je peux et cela semble un cas facilement évitable.

1

Il existe des arguments pour le rendre statique, car il dissocie les classes.

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

Questions connexes