2012-09-14 20 views
7

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?

risposta

6

In Java, il rilevamento di riferimento e la spazzatura sono automatici.

Ma questo non significa che sia completamente nascosto.

Sembra che tu abbia bisogno di ReferenceQueue se vuoi sapere quando un oggetto può essere garbato e forse WeakReference se vuoi mantenere puntatori che non impediscono la spazzatura.

Ti suggerisco di dare un'occhiata alla descrizione dello java.lang.ref package per trovare la soluzione migliore per le tue necessità.

+3

Il conteggio dei riferimenti in Java non è automatico - Java GC non fa affidamento sul conteggio dei riferimenti. –

+0

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. –

+0

Questa è una soluzione sorprendentemente elegante! Non è così spesso che sono impressionato da Java. –

2

Quando si crea un nodo, si cerca in qualche tabella se quel nodo esiste già e in tal caso si restituisce solo un puntatore a quello vecchio, altrimenti si crea il nuovo nodo.

Fare questo meccanismo di ricerca in Java non è così difficile. Basta usare un metodo factory, che controlla una "tabella" e restituisce la stessa istanza se già esiste.

Ho bisogno il riferimento contando quindi so quando eliminare un nodo dalla tabella (in modo che possa essere garbage collection)

Per che Java ha la classe WeakReference. Non ti permette di fare il conteggio dei riferimenti, ma permette che l'oggetto sia GC-ed quando nessuno lo fa più.

combinare questi 2 e

  • è possibile costruire un 'tavolo' popolato da WeakReference s
  • uso uno dei Java Collection implementazioni disponibili che utilizza WeakReference s (ad esempio, un WeakHashmap)
Problemi correlati