2012-09-14 15 views
7

Estoy intentando escribir la clase DagNode en Java, donde dos nodos son lógicamente iguales si son iguales a las referencias.Punteros inteligentes y recuento de referencias en Java

La idea en C++ — (soy de C++) — sería utilizar punteros inteligentes y recuento de referencias:

  • Cuando se crea un nodo, voy a mirar en alguna mesa si eso nodo ya existe. Si es así, devolveré un puntero al anterior. De lo contrario, crea un nuevo nodo.

  • Los métodos sobrecargados de C++ como los constructores de copia y los destructores harán recuento ref, y cuando el recuento ref de un nodo cae a 0, el nodo se expulsa de la tabla mencionada anteriormente. (C++ también liberar la memoria.)

Sin embargo, no parece haber ninguna manera de hacerlo automáticamente ref-conteo en Java. Tendré que hacer un recuento ref para saber cuándo expulsar un nodo de la tabla (para que pueda ser basura), y realmente quiero evitar llamar al node->incRef() y al node->decRef() al comienzo y al final de cada función.

¿Cómo hacemos este modismo C++ en Java?

Respuesta

6

En Java, la encuesta de referencia y la basura son automáticas.

Pero eso no significa que esté completamente oculto.

Parece que necesita ReferenceQueue si desea saber cuándo un objeto puede ser guardado en una bolsa, y quizás WeakReference si desea mantener punteros que no impidan la basura.

Le sugiero que eche un vistazo a la descripción del java.lang.ref package para encontrar la mejor solución para su necesidad.

+3

El recuento de referencias en Java no es automático: Java GC no se basa en el recuento de referencias. –

+0

Permítanme repetir esto para asegurarme de que entiendo. Básicamente tengo una tabla de WeakReference y el objetivo de ReferenceQueue es expulsar a WeakReference de la tabla cuando se obtiene GC de todos modos. Tener una WeakReference en la tabla significa que todavía puede ser GC'd, pero si hay una referencia regular en la pila o en algún otro objeto, entonces no puede ser GC'd. Y ReferenceQueue se asegura de que el desalojo de la mesa ocurra ANTES de la recolección de basura, por lo que todo está bien. –

+0

¡Es una solución sorprendentemente elegante! No es tan frecuente que me impresiona Java. –

2

Cuando se crea un nodo, se mira en alguna mesa si ese nodo ya existe y si es así sólo devuelve un puntero a la antigua, si no, que el nuevo nodo.

Hacer este mecanismo de búsqueda en Java no es tan difícil. Solo use un método de fábrica, que verifica una 'tabla' y devuelve esa misma instancia si ya existe.

necesito la referencia contando así que sé cuando para desalojar a un nodo de la mesa (lo que puede ser basura recogida)

Para que Java tiene la clase WeakReference. No le permite hacer recuentos de referencia, pero permite que el objeto sea GC-ed cuando ya nadie lo referencia.

combinar estos 2 y se puede

  • construir una 'mesa' poblada con WeakReference s
  • uso uno de los disponibles de Java Collection implementaciones que utiliza WeakReference s (por ejemplo, un WeakHashmap)
Cuestiones relacionadas