2012-03-22 5 views
16

Eventuali duplicati:
Have you ever used Phantom reference in any project?Quando utilizzare i riferimenti fantasma in Java?

Ho letto sui diversi tipi di riferimento. Capisco come funzionano i riferimenti forti, morbidi e deboli.

Ma quando ho letto dei riferimenti fantasma, non sono riuscito a capirli veramente. Forse perché non sono riuscito a trovare nessun buon esempio che mi indichi quale sia il loro scopo o quando usarli.

Potrebbe mostrarmi alcuni esempi di codice che utilizzano un riferimento phantom?

+0

O possibilmente: http://stackoverflow.com/questions/1599069/have-you-ever-used-phantom-reference-international-project –

+0

Risposta breve: non ci sono quasi applicazioni, oltre a usarlo come un approccio migliore e più sicuro alla finalizzazione rispetto alla sostituzione di 'finalize'. –

+0

@LouisWasserman puoi darmi un esempio di dettaglio, per favore. Spero di vederlo. grazie :) (dammi solo come utilizzare il riferimento phantom invece di finalizzare) – hqt

risposta

11

Non l'ho mai fatto da solo - pochissime persone ne hanno mai bisogno - ma I penso che sia questo è un modo per farlo.

abstract class ConnectionReference extends PhantomReference<Connection> { 
    abstract void cleanUp(); 
} 
... 
ReferenceQueue<Connection> connectionQueue = new ReferenceQueue<>(); 
... 
Connection newConnection = ... 
ConnectionReference ref = new ConnectionReference(newConnection, connectionQueue, ...); 
... 
// draining the queue in some thread somewhere... 
Reference<? extends Connection> reference = connectionQueue.poll(); 
if (reference != null) { 
    ((ConnectionReference) reference).cleanUp(); 
} 
... 

Questo è più o meno simile a quello che suggerisce this post.