Sto provando a scrivere la classe DagNode in Java per cui due nodi sono logicamente uguali se sono uguali come riferimenti.Puntatori intelligenti e conteggio Ref in Java
L'idea in C++ — (io sono di C++) — sarebbe quella di utilizzare i puntatori intelligenti e il conteggio di riferimento:
Quando viene creato un nodo, cercherò in qualche tabella se che il nodo esiste già. Se è così, restituirò un puntatore a quello vecchio. Altrimenti, crea un nuovo nodo.
I metodi C++ sovraccaricati come i costruttori e i distruttori di copia eseguiranno il conteggio dei ref e quando il conteggio di rif di un nodo scende a 0, il nodo viene rimosso dalla tabella sopra menzionata. (C++ libererà anche la memoria.)
Tuttavia, non sembra esserci alcun modo per eseguire automaticamente il conteggio dei ref in Java. Dovrò fare il ref-count per sapere quando rimuovere un nodo dalla tabella (in modo che possa essere eliminato dalla garbage collection), e voglio davvero evitare di chiamare node->incRef()
e node->decRef()
all'inizio e alla fine di ogni funzione.
Come facciamo questo idioma C++ in Java?
Il conteggio dei riferimenti in Java non è automatico - Java GC non fa affidamento sul conteggio dei riferimenti. –
Consentitemi di ripeterlo per assicurarmi di aver capito. Fondamentalmente ho una tabella di WeakReference e il punto del ReferenceQueue è di sfrattare il WeakReference dal tavolo quando ottiene GC comunque. Avere un WeakReference nella tabella significa che può ancora essere GC, ma se c'è un riferimento regolare nello stack o in qualche altro oggetto allora non può essere GC'd. E il ReferenceQueue si assicura che lo sfratto dal tavolo avvenga PRIMA della garbage collection, quindi tutto è buono. –
Questa è una soluzione sorprendentemente elegante! Non è così spesso che sono impressionato da Java. –