Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 21:41 Der er 22 kommentarer og
1 løsning

Finalizer-metoder

Kan nogen ik lige forklare Finalizer metoder ?
Er det noget med, at tømme et objekt for data ? og hvordan virker det ?
Kom også med et eksempel :)

/Gladmhensk
Avatar billede arne_v Ekspert
14. oktober 2003 - 21:45 #1
finalizer er en metode alle objekter har.

Du kan overide den.

Den bliver kaldt efter at du ikke længere har referancer til objektet
men før det garbage collectes.

Der er ingen garanti for at det bliver kaldt.

Derfor er det ubrugeligt til de fleste praktiske formål.
Avatar billede soreno Praktikant
14. oktober 2003 - 21:49 #2
Arne:
"Der er ingen garanti for at det bliver kaldt."

Hvor har du det fra ?

Jeg synes ikke at kan læse det i dokumentationen ?
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 21:52 #3
"Den bliver kaldt efter at du ikke længere har referancer til objektet
men før det garbage collectes."

For, at være ærlig ved jeg ikke hvad garbage collection er..og man kan vel altid kalde et objekts metoder ?
Avatar billede arne_v Ekspert
14. oktober 2003 - 21:54 #4
garbage collection er når JVM'en frigør memory ved at smid eobjekter ud som
ikke længere bruges.
Avatar billede soreno Praktikant
14. oktober 2003 - 21:55 #5
Når et objekt fødes bruges en variabel til at pege på objektet.
Når variablen ikke længere peger på objektet (og ingen andre variabler heller ikke peger på objektet), vil Garbage Collectoren fjerne objektet fra memory.

Altså en automatiseret rengøringskone.
Avatar billede arne_v Ekspert
14. oktober 2003 - 21:57 #6
søren>

Jeg prøver lige at finde en referance.

Den vil altid blive kaldt hvis objektet GC'es.

Problemet opstår med objekter der ikek GC'es ved program exit.
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:01 #7
Hvordan bruger jeg så finalizer til et objekt, hvis jeg vil fjerne det inden JVM gør det ?
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:03 #8
søren>

Det interessant i API'en er følgende:

runFinalizersOnExit

public static void runFinalizersOnExit(boolean value)

    Deprecated. This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

    Enable or disable finalization on exit; doing so specifies that the finalizers of all objects that have finalizers that have not yet been automatically invoked are to be run before the Java runtime exits. By default, finalization on exit is disabled.

    If there is a security manager, its checkExit method is first called with 0 as its argument to ensure the exit is allowed. This could result in a SecurityException.

Default kaldes finalizer ikke ved exit.

Og det er jo ikke ligefrem fordi opfordrer folk til at enable det !

:-)
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:05 #9
Hvad mener du med at fjerne et objekt inden JVM gør ?

Hvis du ikke har nogle referancer til det så et det set fra applikationens
side gone.

At JVM'en så først garbage collecter et helt bundt objekter når du
mangle rmemory det er jo kun en performance forbedring.
Avatar billede _carsten Nybegynder
14. oktober 2003 - 22:07 #10
Jeg ved ikke om nedenstående eksempel illustrerer det ?

public class TestFinalizer {
    public TestFinalizer() {
        new MyFinalizer();
        MyFinalizer m = new MyFinalizer();
     
        System.gc();
    }
   
    public static void main(String[] args) {
        new TestFinalizer();
        System.gc();
    }
   
    protected void finalize() {
        System.out.println("Finalize form TestFinalizer, hvilket kun sker p.g.a. System.gc() kaldes i main");
    }
}

class MyFinalizer{
   
    public MyFinalizer(){
        System.out.println("MyFinalizer er initieret");
    }
   
    protected void finalize() {
        System.out.println("Finalize from MyFinalizer");
    }
}
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:08 #11
Der står ellers i min bog, at jeg kan kalde finalizer metoden selv, og den dermed vil fjerne alle referencer, og er så klart til sletning af JVM (af JVM står der ikke, men det regner jeg med ??)
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:11 #12
Du kan godt kalde finalizer selv.

Men det garanterer (så vidt jeg ved) ikke at den bliver GC'et.

Men hvad vil du opnå ?
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:11 #13
I.s.f. at kalder en finalizer kunne du jo ligeså godt kalde en almindelig
close metode.
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:14 #14
Fra bogen
"Du kan når som helts kalde finalize()-metoden, da den blot er en metode som alle andre. Men et kald af finalize() bevirker ikke, at et objekt straks indsamles af datarenovationen. I stedet for fjernes alle referencer til objektet, hvorved det markeres som klar til sletning."

hmm...når man selv skriver det fatter man det sgu :D
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:17 #15
"datarenovation" det er da en fordanskning der vil noget.

:-)
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:21 #16
jep, nogle gange tror man, at forfattere er slået over i gammel-dansk når de oversætter engelske ord :)
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:23 #17
Mangler bare at vide hvordan jeg fjerner alle referencer til et objekt med finalize()....står der ikke i bogen....går ikke udfra, at jeg bare såen kan kalde den og den så ved hvilket objekt den skal behandle ;)
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:23 #18
Du kalder den på et objekt.

o.finalize();
Avatar billede arne_v Ekspert
14. oktober 2003 - 22:24 #19
Men jeg er iøvrigt stadig ikke overbevist om at du har brug for at kalde
den.
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:26 #20
arne_v: Bare meget rart at vide, så man ved den findes og hvordan den bruges ;)

læg et svar hvis arne_v ikke skal løbe af med alle...
Avatar billede _carsten Nybegynder
14. oktober 2003 - 22:30 #21
Den som har brændt krudt af må have point = Arne
Avatar billede gladmhensk Nybegynder
14. oktober 2003 - 22:36 #22
Er sgu også rigtig :)
Avatar billede _carsten Nybegynder
14. oktober 2003 - 22:37 #23
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester