Hat Java Destruktor?



  • Hi,

    ich hab keine genaue Ahnung, aber mein Informatiklehrer meinte letztens, es gibt keine Destrktoren in Java, da es den Garbage Collector gebe, mir im Prinzip egal, ich hab bisher noch keinen Destruktor in Java gebraucht, gibts den denn?



  • TheToast schrieb:

    ich hab bisher noch keinen Destruktor in Java gebraucht, gibts den denn?

    Ne, du hast stattdessen ein 2stufiges System:

    1. eine .close() Methode (dafuer gibt es ja die finally Bloecke)
    2. einen finalizer, der aber nicht ganz unproblematisch ist


  • Hi

    der finalizer ist sehr unsicher. Es wird von Java nicht sichergestellt "ob" und "wann" der Finalizer eines Objektes aufgerufen wird.

    Solltest du mal die funktionalität eines Destruktors benötigen um z.B. um noch offene Netzwerkverbindungen sauber zu schliessen oder Temp Fils zu löschen, würd ich einen ShutdownHooks (Runtime.addShutdownHook und Runtime.removeShutdownHook) empfehlen. Diese Threads werden beim beenden der VM ausgeführt.

    gruss Termite



  • Shade Of Mine schrieb:

    TheToast schrieb:

    ich hab bisher noch keinen Destruktor in Java gebraucht, gibts den denn?

    Ne, du hast stattdessen ein 2stufiges System:

    1. eine .close() Methode (dafuer gibt es ja die finally Bloecke)
    2. einen finalizer, der aber nicht ganz unproblematisch ist

    Einfach eine Methode namens close() erstellen?



  • Nicht erstellen. Nutzen und zwar im finally-Bereich deines try-catch-Blockes den du für Socketverbindungen (und andere Streamoperationen) benötigst.



  • also als ich das probiert hab, wurde finally nicht aufgerufen, erst als ich explizit den garbagecollector aufgerufen habe



  • Meinst du finalize() ? finalize() wird erst aufgerufen, wenn das Objekt vom GC gefressen wird. Wenn dein Programm nicht sehr speicherhungrig ist, kann das lange dauern und wenn das Objekt in einer höheren Generation ist, kann das _sehr_ lange dauern, oder auch gar nicht geschehen. Leider ruft die JVM nicht notwendigerweise beim Programmende alle finalizer auf, obwohl die eigentlich schön in einer Liste vorliegen.
    Das ist bei .Net besser gelöst IMHO. Das Betriebssystem räumt zwar schon eigentlich alles auf dann, aber vom Prinzip her wäre es mir lieber, der finalizer käme sicher zum Zug.


Anmelden zum Antworten