PDA

View Full Version : [JAVA] chiarimento su DISPOSE_ON_CLOSE


Maverick82^
02-10-2007, 10:06
Salve,

sto lavorando su una semplice JApplet con qualche JDialog. Volevo capire
per bene cosa comporta questa linea di codice all'interno di una JDialog:

setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

Teoricamente nel momento in cui si clicca sulla 'X' la JDialog dovrebbe
essere distrutta insieme a tutti i componenti in essa contenuta.

Nel mio caso ho un'altra classe che chiamo Logica, che gestisce la
logica e fa riferimento alla JDialog per esporre eventuali errori.
Mi sono accorto che in realtà anche dopo il dispose della JDialog,
l'istanza della classe Logica si riferisce sempre all'istanza della
JDialog creata in precedenza.

Infatti il controllo del seguente metodo contenuto in Logica fallisce,
quindi vuol dire che jdialog esiste ancora... ma non doveva essere
distrutto quando ho chiuso la la JDialog?

public void setJDialogAdmin(JDialogAdminRegistra jdialog) {
if (this.jdialog == null)
this.jdialog = jdialog;

}

Spero di essere stato chiaro...:)

andbin
02-10-2007, 10:42
Mi sono accorto che in realtà anche dopo il dispose della JDialog,
l'istanza della classe Logica si riferisce sempre all'istanza della
JDialog creata in precedenza.Beh, questo sì, ovvio, ma è un concetto che vale in generale. Un oggetto è eleggibile per il garbage collection solo quando non è più raggiungibile da alcun live thread.
Se da qualche parte hai un reference a quella JDialog .... beh, l'oggetto è ancora in vita!

ma non doveva essere distrutto quando ho chiuso la la JDialog?Come ho detto, se l'oggetto è ancora referenziato, allora non può certamente essere garbage collected (a parte le "isole" di oggetti ma non andiamo adesso per il sottile...).

dispose() rilascia solamente quelle risorse "native" (memoria, handle, ecc...) necessarie per il rendering sullo schermo.

Maverick82^
02-10-2007, 13:05
ti ringrazio molto. Ho pensato che fosse come hai detto, ma cercavo una conferma ;)

Comunque ho risolto usando il pattern singleton, così evito di creare sempre una nuova istanza :)