Sie können Objekte bereinigen, indem Sie Verweise darauf entfernen, wenn Sie sie nicht mehr benötigen. Sie müssen es nicht explizit tun. Bei einer expliziten Bereinigung müsste der Verweis auf null gesetzt werden, um dem Garbage Collector einen Hinweis zu geben, dass das Objekt erfasst werden kann. Dieser Hinweis funktioniert aufgrund von internen Referenzzählungen für jedes Objekt, die intern gepflegt werden. Zum Beispiel
C a = new C(); //create an object of class C and assign it to 'a'
a = new C(); //create another object of class C and assign it to 'a'. The older object is no longer referred to. It is now eligible for GC.
Es gibt bessere Alternativen() je nach finalisieren, wie viel finalize(), um Ihre Situation zu helfen.
Oft empfiehlt es sich, eine Methode wie close() oder disposeResources() in der API bereitzustellen, die es dem Aufrufer ermöglicht, die API bei der Bereinigung zu unterstützen. Zum Beispiel die java.sql.Connection class does this. Dies ist besser als die Methode finalize(), da die JVM die finalize() -Methode aufruft. Oft wird die finalize() -Methode von einem Thread mit niedriger Priorität in der JVM ausgeführt, was zu merkwürdigen Fehlern führt.
Im Falle der Connection-Klasse erweist sich das Warten auf die Fertigstellung der JVM in vielen Anwendungen als kostspielig, da eine Datenbank nur so viele Verbindungen gleichzeitig aufnehmen kann. Daher rufen die meisten Programmierer close() explizit für ein Connection-Objekt auf.
In Ihrem Fall, sollte es in etwas ähnliches (und in diesem Zusammenhang wird der finally-Block immer laufen garantiert) übersetzen
try
{
ThirdPartyInitialize();
// use third party component in this try block
}
finally
{
ThirdPartyTerminate();
}
Dies ist ähnlich der, wie der Connection-Klasse auch in den meisten verwendet wird, Situationen.
würde ich * nicht * sagen, dass finalize() ist ähnlich wie bei einem destructor. Der Rest Ihres Textes ist in Ordnung, aber er widerspricht weitgehend dieser ersten Aussage. Sie wissen nie, wann finalize() aufgerufen wird. Im Gegensatz zu einem C++ - Destruktor, der aufgerufen wird, wenn ein Objekt den Gültigkeitsbereich verlässt oder gelöscht wird. –
Wenn ein Objekt als Garbage Collection erfasst wird, wird der Finalizer aufgerufen. Es ist jedoch keine Idee, wann der Garbage Collector gesammelt wird. Daher wird der Finalizer möglicherweise nicht rechtzeitig aufgerufen. –