metoda Finalize

0

Witam

Czytam Thinking in java i zastanawiam się nad metoda Finalize()

Doszedłem do wniosku, że to taki destruktor z c++, który moze się nie włączyć jeśli mamy wystarczająca ilość pamięci, i w ogóle nie jest związany z niszczeniem obiektu tylko pozostałością (zużyta, nie zawiera żądnej referencji)

Czy dobrze myśle ??
Pozdrawiam
Michał

0

Metoda finalize to faktycznie trochę taki 'destruktor z C++'.

Jest ona wywoływana wtedy, kiedy twój obiekt jest 'sprzątany' przez GC. Jeśli masz na przykład klasę 'Plik' (albo 'PołączenieInternetowe' etc) to chciałbyś żeby otwarty plik był zawsze poprawnie zamknięty.

Zazwyczaj zakładasz że użytkownik jest porządny, i wywoła jakąś metodę '.Close()' na pliku . Jeśli jednak tego nie zrobi, chcesz się upewnić że plik będzie poprawnie uwolniony, i właśnie do tego służy metoda finalize() - liczysz że /kiedyś/ zostanie wywołana, więc /kiedyś/ Twój plik będzie zamknięty.

Problem w tym że na metodzie finalize() nie należy polegać, bo może się okazać że zanim GC zdąży zwolnić obiekt, program kończy swoje działanie... Dlatego nadaje się do zwalniania zewnętrznych zasobów, ale raczej nie do sterowania działaniem programu.

0

a jest jakaś metoda, która się zawsze włancza jak ginie obiekt??

0

@antua to jest właśnie ta metoda. Problem w tym że nie masz wpływu na to kiedy owy obiekt "zginie".

0

Włąśnie używająć funkcji systemowej System.gc(); dla poniższego przykładu :

 
package chapter53;

import java.lang.Object;

class Book
{
    
    boolean checkedOut = false;
    Book(boolean checkOut)
    {
        checkedOut = checkOut;
    }
    void CheckIn()
    {
        checkedOut = false;
    }
    @Override
    protected void finalize()
    {
        if(checkedOut) System.out.print("Wypozyczona");
        else System.out.print("Nie Wypozyczona");
    }
}



public class Main {
    public static void main(String[] args) 
    { 
        {
            Book novel = new Book(true);
            Book horror = new Book(true);
            horror.CheckIn();
        }
        System.gc();
        System.out.print("***************************");
        new Book(true);
    }

}

poza tym załóżmy że mam program otwarł mi port. Jeśli go nie zamknę ktoś może wejść na mojego kompa.

0

poza tym załóżmy że mam program otwarł mi port. Jeśli go nie zamknę ktoś może wejść na mojego kompa.

Dokładnie do tego /nie/ służy finalize() - jeśli program 'otwarł' (litości!) Ci port, niech go zamknie:

port = openPort();
try {
   doStuff(port);
}
finally {
   closePort(port);
}

Za pomocą finalize() możesz najwyżej wykonać wyjątkowe zamknięcie portu jeśli z jakiegoś powodu ten port nie został zamknięty normalnie - ale to jest sytuacja wyjątkowa, a nie normalne działanie.

0

@antua System.gc nie powoduje uruchomienia gc i zabijania obiektów! Może to zrobić, ale nie musi! To tylko sugestia.

0
  1. Wywołanie System.gc() jest tylko sugestią. Jeżeli algorytm gc stwierdzi, że nie ma potrzeby wywołania to nie wywoła.
  2. metoda finalize nie jest desktruktorem, ani "czymś podobnym". Jest to metoda wołana w momencie gdy GC stwierdzi, że nie ma już referencji do danego obiektu. Co zabawne można w ten sposób doprowadzić do całkiem fajnych "efektów ubocznych". Metoda ta może, ale nie musi być wywołana przez gc. \
public class A{
    public static void main(String[] a){
        b = new B();
	System.out.println(b.toString()+" "+Runtime.getRuntime().freeMemory());
        b = null;
        System.gc();
	System.out.println(b + " "+Runtime.getRuntime().freeMemory());        
    }

    public static B b;
}

class B{

  public void finalize(){
      System.out.println(this);
      A.b = this;
  }

}
  1. Jeżeli jakiś obiekt zarezerwował sobie zasób np. port to powinien go zwolnić. Zwolnienie zasobu powinno być przeprowadzone w takim samym trybie jak rezerwacja tzn. jeżeli jest metoda open() to jest i close(). Jeśli metodę open() musi wołać użytkownik to powinien też wołać close(). Jeżeli wywołanie open() dzieje się "w tle" to close też powinno być wołane w tle w momencie zakończenia prazy z obiektem. Jednak nie w momencie jego niszczenia!

1 użytkowników online, w tym zalogowanych: 0, gości: 1