Ci sono dettagli sul fatto che un oggetto venga pulito o meno usando finalize()
se il costruttore di quell'oggetto presenta un'eccezione.Può essere chiamato dopo che un costruttore ha generato un'eccezione?
Quando questo metodo viene chiamato è notoriamente mal definito. In base al manuale:
Il linguaggio di programmazione Java non garantisce quale thread applicherà per un determinato oggetto. È garantito, , tuttavia, che il thread che richiama finalize non manterrà alcun blocco di sincronizzazione visibile all'utente quando viene richiamata la finalizzazione. Se un'eccezione non rilevata viene generata dal metodo finalize, l'eccezione è ignorata e la finalizzazione di tale oggetto termina.
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize%28%29
non sono stato in grado di innescare il metodo Finalize in questo modo. Qualcuno sa se è possibile che NON venga chiamato o che in alcuni casi viene chiamato dopo che il costruttore non è riuscito a inizializzare l'oggetto (con un'eccezione).
Lo chiedo perché ho un oggetto che non deve essere ripulito due volte. Sto cercando di capire se è sicuro ripulire prima di lanciare l'eccezione o se devo lasciare un marcatore per finalize()
per saltare in modo efficace e non fare nulla.
+1 Ho il sospetto che è qualcosa che sarà necessario verificare a diverse JVM potrebbero comportarsi in modo diverso. –
L'uso di 'finalize' è malvagio. –
@Peter il JLS è abbastanza specifico, un oggetto è definibile una volta che il costruttore per l'oggetto [base] è stato completato con successo. –