Ho letto molte delle domande principianti su Java finalize()
e trovo sconcertante che nessuno abbia chiarito che finalizzare () è un modo inaffidabile per ripulire le risorse. Ho visto qualcuno commentare che lo usano per ripulire Connections, il che è davvero spaventoso poiché l'unico modo per avvicinarsi alla garanzia che una connessione sia chiusa è implementare try (catch) finalmente.
Non avevo studiato in CS, ma ho programmato in Java professionalmente per quasi un decennio ormai e non ho mai visto nessuno implementare finalize()
in un sistema di produzione mai. Ciò non significa ancora che non abbia i suoi usi o che le persone con cui ho lavorato lo stiano facendo bene.
Quindi la mia domanda è: quali casi d'uso ci sono per l'implementazione finalize()
che non possono essere gestiti in modo più affidabile tramite un altro processo o sintassi all'interno della lingua?
Fornisci scenari specifici o la tua esperienza, semplicemente ripetere un libro di testo Java o finalizzare l'uso previsto non è sufficiente, in quanto non è l'intento di questa domanda.
finalize()
. Tuttavia, il codice della libreria della piattaforma , come SocketInputStream
, che gestisce le risorse native per conto del chiamante, lo fa per cercare di ridurre al minimo il rischio di perdite di risorse (o utilizza meccanismi equivalenti, come quelli PhantomReference
che sono stati aggiunti in seguito.) Quindi l'ecosistema ne ha bisogno , anche se il 99,9999% degli sviluppatori non ne scriverà mai uno.