![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Hallo,
okay .. stelle ich hier mal meine erste Fachfrage bzgl. Java. Es geht um etwas, was ich soeben gefunden habe ... Destruktoren in Java. Guido Krüger schreibt. Zitat:
Jou. Also da steht kurz, dass man gar nicht sicherstellen kann, dass der Destruktor überhaupt aufgerufen wird. Darf ich mal ganz kurz fragen, warum es dann überhaupt so etwas wie einen Destruktor gibt? Da steige ich nämlich nicht wirklich hinter. Danke Euch. Grüße Ben. |
|
|
|
|
|
|
Nach oben #2 |
|
Benutzer
Registriert seit: 08.02.2005
Ort: Wien
Beiträge: 85
|
Grob gesagt könnte man sagen, dass Sun die völlig umsonst reingetan hat.
In anderen Programmiersprachen ist es üblich, in den Desruktoren die Ressourcen freizugeben, in Java werden dafür aber meist eigene Methoden verwendet, da die Destruktoren von Java nicht brauchbar dafür sind (zB die close() Methoden bei Streams). Vielleicht hat Sun die nur reingegeben, weil ja die meisten anderen Programmiersprachen auch welche haben. Effektiv haben sie aber, wie gesagt, gar keinen Wert. Am besten gar nicht verwenden, einfach deren Existenz ingorieren. MfG
__________________
Kosmetik Hobby |
|
|
|
|
|
Nach oben #3 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Ist ja irgendwie nicht befriedigend, oder? Es ist so viel Zeug als "deprecated" markiert, warum werden dann die Destruktoren nicht auch einfach entfernt? Hm. Alles unverständlich ... finde ich .. |
|
|
|
|
|
|
Nach oben #4 |
|
Gast
Beiträge: n/a
|
Also zum einen: Was sicher schon klar geworden ist: In Java spielen Destruktoren bei weitem nicht so eine wichtige Rolle wie z.B in C++. Dies liegt an dem GC (Garbage Collector).
Willst du nun das vor der tatsächlichen "Zerstörung" eines Objekts best. Operationen noch ausgeführt werden, so kannst du eine finalize() Methode implementieren und in dieser entsp. Schritte durchführen. Allerdings steht im Handbuch ja auch das es nicht sichergestellt ist das der Compiler tatsächlich finalize() aufruft. Ich denke Destruktoren sind in einigen wenigen Bereichen vielleicht ganz sinnvoll, aber im normalen Gebrauch nicht. Ist zumindest meine Meinung. Wenn du eine Referenz auf ein Objekt hast, dann weiss diesem lieber "null" zu um es zu "löschen", da Objekte automatisch gelöscht werden wenn keine Referenz mehr darauf existiert. |
|
|
|
Nach oben #5 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Ich habe schon verstanden, was da steht. Ist ja nicht wirklich anspruchsvoll
Mir ging es mehr um den Sinngehalt der Destruktoren, der aber ja anscheinend nicht wirklich vorhanden ist. Grüße Ben. |
|
|
|
|
|
Nach oben #6 |
|
Gast
Beiträge: n/a
|
Ich habe nicht bezweifelt das du das verstanden hast, nur vielleicht liest sich jemand das hier durch der noch nichts davon gehört hat .
Wie gesagt, abgesehen davon das du vielleicht in finalize() best. Operationen durchführen willst (da deine Objekte Netzwerkverbindungen geöffnet haben etc.), kannst du dort z.B. diese schließen oder andere schöne Dinge anstellen. Mich hat diese Antwort auch nicht befriedigt , aber unser Prof konnte auch nicht erkären warum die Leute von SUN es nun (so) implementiert haben. |
|
|
|
Nach oben #7 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Man könnte maximal in Destruktoren überprüfen, ob nicht doch noch irgendwas aufgrund irgendwelcher fehlerhafter Operationen im Programm zu "schließen" etc. ist und dann Anweisungen ausführen, die eben dies tun. Das wäre dann z.B. noch eine Absicherung, die zwar nicht immer verfügbar ist, aber eventuell das Ausmaß von Fehlern reduzieren kann. Was anderes fällt mir beim besten Willen nicht ein. Grüße Ben. |
|
|
|
|
|
|
Nach oben #8 | |
|
Gast
Beiträge: n/a
|
Zitat:
Wäre auch froh wenn jemand mal hieb und stichfeste argumente liefern könnte. |
|
|
|
|
Nach oben #9 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Gut. Ich habe mal etwas in den Foren auf SUN rumgestöbert. Und da steht genau das selbe, was wir hier auch von uns gegeben haben. Selbst der Aufruf von System.gc(); reicht nicht aus um abzusichern, dass der GarbageCollector anfängt u.a. Destruktoren aufzurufen. Nunja. Da muss ich mich wohl mit dieser unbefriedigenden Antwort begnügen. Danke und Grüße Ben. |
|
|
|
|
|
|
Nach oben #10 |
|
Gast
Beiträge: n/a
|
Hi Ben,
wie Du vorhin schon (in einem Nebensatz)festgestellt hast: Man braucht den finalize praktisch nur zum Aufräumen von Ressourcen, wenn jemand vergessen hat, close() aufzurufen. Im Client-Betrieb kann vielleicht darauf verzichten, aber bei Server-Betrieb passiert eine Garbage-Collection schon mal öfter... Und im Server-Betrieb ist so eine Selbstheilung echtes Gold wert. Ach übrigens: Wenn man eine gc() braucht: Mehrfach aufrufen und zwischendurch warten reicht meist aus... |
|
|
|
Nach oben #12 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Ich dachte, dass die finalize()-Methode aus Objekt leer implementiert .. Danke .. |
|
|
|
|
|
|
Nach oben #13 |
|
Gast
Beiträge: n/a
|
... solange Du Dich von Object ableitest stimmt das.
Aber Du leitest Dich nicht unbedingt von Object ab und wenn Du das nicht tust und in Deinem Code eine Exception geworfen wird, werden die "Parent"-Klassen nicht finalisiert. Und den Fehler such dann mal schön... |
|
|
|
Nach oben #15 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Okay.
Ich hoffe, dass das richtig und einigermaßen verständlich zusammenfasst wurde. Grüße Ben ;_)
__________________
Mehr TuS Koblenz geht nicht ... Aktuell ... - Neue Gegner für die TuS: 1.FC Nürnberg - 5 neue Gegner 2008/09 - Informationsveranstaltung für Mitglieder - Förderkasse füllt sich - B-Jugend Rheinlandpokalfinale terminiert - A-Jugend I gewinnt Rheinlandpokal Geändert von Jann Hendrik (05.06.2007 um 09:10 Uhr). Grund: php-info.org - link entfernt. |
|
|
|
|
|
Nach oben #16 |
|
Gast
Beiträge: n/a
|
... normalerweise schreibt man im Finalizer Code z.B. wie folgt:
Java Code:
Dadurch wird beim Aufräumen die close() Methode aufgerufen, wenn das nicht schon ohnehin passiert ist. |
|
|
|
Nach oben #17 |
|
Chefkoch-Mod
Registriert seit: 30.05.2004
Beiträge: 433
|
Ganz ehrlich?
Der Text klingt ein wenig wischi-waschi. So als würder der GC selber handeln - nach dem Zufallsprinzip. Dem ist aber ja nun nicht so. Er kommt, wenn der Rechner genug Kapazitäten dafür frei hat. Notfalls müsste man das Programm anhalten, damit der GC aufräumen kann. Und die Stelle "GC mehrmals aufrufen und dazwischen warten" klingt auch sehr komisch. Gut, er ist dann öfter in der Schleife und hat somit eine höhere Wahrscheinlichkeit dran zu kommen, aber ob das der richtige Weg ist? Sonst ist es aber ok.
__________________
Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de |
|
|
|
|
|
Nach oben #19 |
|
Gast
Beiträge: n/a
|
@Ben: Das war ein Beispiel. Wenn man close() mehrfach schadlos hinterienander aufrufen kann, kann man auch einfach nur close() angeben.
@sym: Die Tücke ist, dass zum einen genügend Kapazität frei sein muß, damit mit System.gc() der Garbage Collector überhaupt losläuft und zum anderen es nicht zwingend gesagt ist, das in einem Lauf alle Objekte behandelt werden. Deshalb muß man - um sicherzugehen - den gc mehrfach aufrufen mit Pausen dazwischen (wegen der Kapazität). Und wann der GC ansonsten aufgerufen wird, ist natürlich determiniert, aber von GC zu GC und von JVM zu JVM unterschiedlich. |
|
|
|
Nach oben # |