Implementación de árbol B - he de hacer que la clase Nodo una clase miembro estático o no?
-
29-09-2019 - |
Pregunta
Necesito implementar un árbol B de la Universidad:
Tengo una clase de "exterior" B-Árbol con atributos root y _degree. La clase para representar los nodos se implementa como una clase estática miembro:
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;
}
}
Así pues, ahora mi problema es:. Como he implementado la clase de nodo como una clase miembro estático, no puedo acceder al atributo de grado de la clase externa
Ahora tengo que opciones:
- Hacer la clase Node una clase interna (clase de miembro no estática) o
- Crea un constructor de la clase de nodo y pasar el grado en que cada vez que necesito para construir un nodo.
¿Cuál sería la mejor opción? Por lo que es una clase interna que significaría los nodos sería todos tienen una referencia a la Btree (clase externa), pero lo que es una clase de miembro estático significaría que tendría que pasar el grado en cada vez.
Solución
Lo mantendría estática y pasar de grado. De esta manera se asegura que Node
no puede conocer ningún detalle acerca de BTree
.
Otros consejos
Si fuera yo, tendría el público de clase Node
para que pudiera volver a utilizarlo en otras estructuras de datos que contienen, pero eso es sólo conmigo. En ese caso, tendría que pasar el grado a través del constructor, y eso está bien conmigo también. No me gusta la idea de las clases internas manipulación de los miembros de las clases que encierran. Siento que hace que las clases demasiado estrechamente ligados entre sí. Sé que a veces es apropiado, pero evito cuando puedo y esto parece un caso fácilmente evitable.
Hay argumentos para que sea estático, ya que desacopla las clases.
Sin embargo, creo que un BTree.Node es un nodo de un BTree particular. No tiene sentido ir y crear un grupo de nodos (con grados al azar). No se puede tener un nodo, pero ningún árbol. Por lo tanto, digo no estático.