[INVALID] [patch] super.finalize()-Aufrufe

Hier finden YaCy User Hilfe wenn was nicht funktioniert oder anders funktioniert als man dachte. Bei offensichtlichen Fehlern diese bitte gleich in die Bugs (http://bugs.yacy.net) eintragen.
Forumsregeln
In diesem Forum geht es um Benutzungsprobleme und Anfragen für Hilfe. Wird dabei ein Bug identifiziert, wird der thread zur Bearbeitung in die Bug-Sektion verschoben. Wer hier also einen Thread eingestellt hat und ihn vermisst, wird ihn sicherlich in der Bug-Sektion wiederfinden.

[INVALID] [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Di Feb 02, 2010 3:26 pm

Anbei ein Patch, dass zur SVN 6641 passt und folgendes umbaut/verbessert:
- in vielen ueberschriebenen finalize()-Methoden fehlte ein super.finalize()-Aufruf.
- "syncrhonized" war in einer solchen Methode in der Signatur, was ich auf einen sychronized-Block umgeschrieben habe (nicht die ganze Methode braucht sychronized zu sein)
- Viele fehlende Neue-Zeile am Ende der Java-Dateien (ich habe nicht alle angepasst, kann aber auch problemlos mit NetBeans/Eclipse refactured werden)
- Einige fehlende synchronized-Bloecke fuer Klassenattribute gesetzt, damit sie hoffentlich thread-safe werden

Zum ersten Punkt moechte ich nun laenger erklaeren: finalize() ist zum Aufraeumen der Objekte da, freilich darf man diese ueberschreiben, man sollte dann aber dennoch die super-Methode aufrufen. Tut man dies nicht, kann dies bei spaeteren Java-Updates Seiteneffekte hervorrufen, die sehr eigenartig sein koennen, weil das Objekt nicht komplett aufgeraeumt ist.

Zur Zeit ist zwar die finalize-Methode in der Object-Klasse leer, man sollte sie aber dennoch aufrufen. So wurde es uns jedenfalls bei der SCJP-Pruefung und Ausbildung zum Anwendungsentwickler gelehrt.
Zuletzt geändert von Quix0r am Sa Apr 24, 2010 4:40 pm, insgesamt 3-mal geändert.
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Lotus » Di Feb 02, 2010 3:57 pm

Hm, das Überschreiben ist doch extra dazu gedacht, um etwas anders zu machen. Wenn man jetzt blind noch die Methode der Basisklasse aufruft, kann es passieren dass etwas falsch läuft. (Ich habe den Patch nur schnell durchgescrollt.)
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Di Feb 02, 2010 4:08 pm

Wird aber im aktuellen Code an einigen Stellen schon getan, daher war meine Idee, das konsistent ueberall zu machen. :)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Mo Feb 15, 2010 11:56 pm

Soweit es mir beigebracht wurde, kann man problemlos finalize() ueberschreiben. Wenn man dies aber tut, sollte man nach seiner Aufraeuftaetigkeit super.finalize() aufrufen, da es eigentlich recht gaengig ist. Vielleicht wird z.B. MyObject refactured, dass es MyGenericObject erweitert und dort ebenfalls ein finalize() ist? Dann wuerde dies niemals aufgerufen werden.

Mit meinem Patch (es muss noch ein "throws Throwable" in die Signatur) wuerde dies immer sichergestellt sein, dass egal ob MyObject extends MyGenericObject oder gar MySpecialObject extends MyObject, es wuerde immer bis auf die unterste finalize()-Methode zurueck aufgerufen werden, durch den super-Aufruf. Ohne diesem koennte das bei spaeteren Updates uebersehen werden und seltsame Dinge ausloesen z.B. dass das Objekt nicht bereinigt wird.
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Di Feb 16, 2010 12:13 am

Hier noch ein paar weiterfuehrende Links dazu:
http://cwe.mitre.org/data/definitions/568.html
http://pmd.sourceforge.net/rules/finalizers.html
Dem nach werde ich dann mal mein Patch umschreiben und dieses hier entfernen. :)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Fr Apr 23, 2010 1:51 pm

Mit Revision 6835 hat Orbiter die finalize-Methoden komplett entfernt. Beim Durchsichten ist mir aufgefallen, dass diese zum groessten Teil unsauber (-er ging es teilweise kaum noch) implementiert waren. Da wurde mal IOException weitergeworfen, obwohl finalize-Methoden Throwable weiterwerfen sollen, da fehlten (sehr oft!) die hier angesprochenen super.finalize()-Aufrufe, oder gar das "final" Keyword war vorhanden.

Ich schreibe es deswegen in der Vergangenheit, weil ich Revision 6835 revertet und verbessert habe, nach folgendem Schemata:
Code: Alles auswählen
@Override
protected void finalize () throws Throwable {
    try {
        // Rufe close(); oder finish(); auf, je nachdem was implementiert ist. Dort sollten dann die uebrigen
        // Klassenverknuepfungen geloest werden und weitere "Resourcen" freigegeben werden. Exemplarisch
        // schreibe ich hier daher:
        this.closeResources();
        // ... auch wenn diese nirgens vorkommt. Der Aufruf soll es nur verdeutlichen, wie man es sauber macht.
    } finally {
        super.finalize();
    }
}

So gehoert eine saubere finalize()-Implementierung. Man koennte auch, sehr empfehlenswert, hier den Visitor-Pattern nehmen und einen FinalizeVisitor implementieren, der dann ueberall durchgereicht wird und das Aufraeumen uebernimmt, nur so als Ideen-Ansatz. :)

Aber vielleicht sollten viel wichtiger nachgedacht werden, die kurzlebigen Objekte in langlebige umzuwandeln und diese in Pipelines umzubauen, so dass die Daten nur durchgepipet werden und nicht jedes Mal ein neues Objekt generiert wird und das alte erstmal aufgerufen wird. Auch kommen hier die (von mir an vielen Stellen entdeckten) grossen Initialisierer-Bloecke und Konstructoren (beide sollte man per default klein halten, damit das Initialisieren schneller geht) negativ zum Tragen, weil diese bei der Objekt-Initialisierung gleich noch ein paar andere (zeitspielige) Objekte initialisieren muessen, was auch mehr Speicherverbrauch bedeutet (ist do klar: Jedes Attribut kostet Speicher).

Das sollte mal vor dem 1.0-Release konsequenter umgesetzt werden, als noch mehr Bugs (wegen unsauber aufgeraeumter Objekte) zu produzieren. Ich will hier niermanden damit angreifen, schon gar nicht Orbiter, da er viele Jahre da reingesteckt hat. Aber lasst euch das (allen) nochmals durch den Kopf gehen. :)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Orbiter » Fr Apr 23, 2010 7:16 pm

nochmal zum nachlesen:
http://java.sun.com/javase/6/webnotes/t ... html#gbyvh
steht auch im commit aussergewöhnlich ausführlich
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Fr Apr 23, 2010 7:35 pm

Dann bleibt ja nur noch letzteres: Visitor-Pattern, soweit ich das verstanden habe.

Oder vielleicht alle testweise rauskommentieren?
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Re: [patch] super.finalize()-Aufrufe

Beitragvon Orbiter » Fr Apr 23, 2010 8:34 pm

nein es ist schon richtig so. Es ist offenbar nicht richtig überall finalizer aufzurufen, mal abgesehen davon dass es unnötog ist, wenn die Klasse eine close-Methode hat, die explizit aufgerufen wird. Es ist aber nicht richtig alle zu entfernen, speziell die Klassen die Datenbanken schreiben, da sind sie richtig. Bei den throw-away Objekten nicht.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: [patch] super.finalize()-Aufrufe

Beitragvon Quix0r » Sa Apr 24, 2010 4:39 pm

Dann hat ja mein Patch indirekt etwas gebracht. :)
Quix0r
 
Beiträge: 1345
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld


Zurück zu Fragen und Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste