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?
El recuento de referencias en Java no es automático: Java GC no se basa en el recuento de referencias. –
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. –
¡Es una solución sorprendentemente elegante! No es tan frecuente que me impresiona Java. –