# finalize()



## Rock Lobster (10. Sep 2007)

Servus,

auch wenn man nicht sicher sagen kann, wann finalize() aufgerufen wird - eigentlich müßte doch zumindest beim Beenden des Programms diese Methode aufgerufen werden, oder? Oder wird das Programm einfach irgendwie beendet, ohne daß jedes Objekt sauber "zerstört" wird?


----------



## bygones (10. Sep 2007)

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize()

so wie ich das daraus lese.... nein


----------



## Murray (10. Sep 2007)

Man kann sicher sagen, dass finalize aufgerufen wird, wenn das Objekt "garbage-collected" wird. Dass das beim Beenden passiert, ist nicht gewährleistet; es gibt zwar eine Methode, mit der man dieses Verhalten erzwingen kann (System#runFinalizersOnExit), aber die ist deprecated.


----------



## Wildcard (10. Sep 2007)

Warum möchtest du finalzier verwenden?
In den allermeisten Fällen denkt ein Entwickler nämlich nur das es finalzier braucht, dabei sind sie in der Regel unnötig, langsam und gefährlich.


----------



## Rock Lobster (10. Sep 2007)

Ich hätte sie halt gerne verwendet, um temporäre Dateien zu löschen, die eine bestimmte Komponente bei mir anlegt. Da dies recht oft vorkommen kann, ist es sinnvoller, die zu löschen, sobald sie nicht mehr benötigt werden, anstatt das erste beim Beenden der Applikation zu machen (da kann ja u.U. das Laufwerk voll werden, was ziemlich kacke wäre).


----------



## Wildcard (10. Sep 2007)

Glaub mir, du möchtest keine finalizer verwenden. Vor allem nicht aus bequemlichkeit.
Wenn es gar nicht anders geht die Dateien zu löschen, als wenn das Objekt entfernt wird (und meistens geht es auch anders), dann nimm statt finalize PhantomReferences.


----------



## Leroy42 (10. Sep 2007)

Schau dir mal  java.io.File#deleteOnExit() an


----------



## Rock Lobster (10. Sep 2007)

> Glaub mir, du möchtest keine finalizer verwenden



Kannst Du das dann wenigstens ein wenig genauer erläutern?

@ Leroy: Das funzt leider auch nicht immer... wie so einiges unter Java... langsam hab ich das Gefühl, Java ist eine Wahrscheinlichkeits-Sprache


----------



## Wildcard (10. Sep 2007)

Das hab ich doch heute schonmal gepostet:
Finalizers are not your Friend



			
				Rock Lobster hat gesagt.:
			
		

> @ Leroy: Das funzt leider auch nicht immer... wie so einiges unter Java... langsam hab ich das Gefühl, Java ist eine Wahrscheinlichkeits-Sprache


Nein, Java2K ist eine Wahrscheinlichkeitssprache.


----------



## Leroy42 (10. Sep 2007)

Rock Lobster hat gesagt.:
			
		

> @ Leroy: Das funzt leider auch nicht immer..


Bei mir klappts immer.
Vielleicht liegt es ja daran:
_Deletion will be attempted only for normal termination of the virtual machine, _
Bist du dir sicher, daß dein Programm nicht irgendwo
eine Exception schmeißt, die du nicht abfängst, und das
_normalen Beenden_ der VM verhindert?
Ansonsten definier mal was du unter _nicht immer_ verstehst.


----------



## Rock Lobster (10. Sep 2007)

Naja klar, wenn die VM außerplanmäßig beendet wird, dann wird das definitiv NICHT aufgerufen. Aber das allein ist schon schlimm genug, weil das ja durchaus vorkommen kann. In dem Fall ist es mir lieber, die Dateien werden so bald wie möglich gelöscht.

Aber mal schauen, ich arbeite grad an einem größeren Projekt mit, und es kann sein, daß ich das verbessern kann, indem ich nicht an meiner Komponente arbeite, sondern an der Anbindung.

@ Wildcard: Okay, werd's mir mal durchlesen


----------

