Konular

Java Class Yapısında Finalize Metotunun Kullanımı

Finalize metotu

Java Class Yapısında Finalize() Metotu

C++'dan farklı olarak Java'da yok edici tanımlama (destructor) yapılamamaktadır. Buna karşın bir nesnenin yok edilmesi durumunda bir şeylerin yapılması gerekiyorsa finalize() metodu kullanılabilmektedir. Bu metot çalışma esnasında nesne yok edileceği zaman çağırılacaktır. Bu metot bir sona erdirme (finalization) metodudur.

Kullanımı şu şekildedir:

protected void
finalize() {
  // son yapılacak işlemler
}
 

  Burada protected tanımlaması sınıfın dışındaki bir kodun bu sınıfa ait finalize() metodunu çağırmaması içindir. Kontrol ve çağırma tamamen çalışma esnasında JVM tarafından ve otomatik yapılır.

 

Eğer yeni oluşturduğunuz classınızda composition yöntemi ile diğer class ları kullanmışsanız , bu kullanılan class ların finalize() methodlarının çağrılmasını hakkında herhangi bir endişemiz olamaz .Fakat işin içine kalıtım girerse işler biraz renk değiştirir, şöyleki ;  eğer türemiş bir class ın finalize() methodunun içinden ana class ının finalize() methodunu çağırmadınız sürece , ana class ın finalize() methodu çağrılmaz . Bunun sebebi , ilk olarak türetilmiş class ın yok olması gerektiğindendir .  Ana class , türemiş class dan daha önce hafısazan silinirse , birçok hata ile karşılaşmamız mümkün.

Aşağıdaki örnekte türemiş class ın finalize() methodunun içinde ana class ın finalize methodu çağrılmadı ancak 2. örnekde Artik super.finalize() sayesinde türetilen  objeninde finalize() methodu da  çağrılıyor.

// kalitim  ve finalize - I
class Vitamin {

    private String isim;

    public Vitamin(String gelen) {
        isim = gelen;
        System.out.println("Vitamin yapilandirici " + isim);
    }

    public void finalize() {
        System.out.println("Vitamin finalize() " + isim);
    }
}

class Bugday {

    Vitamin a = new Vitamin("Bugday");

    public Bugday() {
        System.out.println("Bugday yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Bugday finalize()");
    }
}

class Un extends Bugday {

    Vitamin a = new Vitamin("Un");

    public Un() {
        System.out.println("Un yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Un finalize()");
    }
}

class Ekmek extends Un {

    Vitamin a = new Vitamin("Ekmek");

    public Ekmek() {
        System.out.println("Ekmek yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Ekmek finalize()");
    }
}

public class Firinci {

    public static void main(String args[]) {

        new Ekmek();
        System.out.println("Temizlik Basliyor .. ");
        System.gc();
    }
}//
 

 

Açıklama;Şimdide “Temizlik Baslıyordan”  sonraya bir bakalım.

System.gc() komutu ile Garbage Collector tetiklendi , eğer   bu komut çağrılmasaydı belkide  hiç bir obje hafızandan temizlenmiyecekti  çünkü Garbage Collector  , hafızanın doluluk oranına göre çağrılır . Eğer bizim yazdığımız kod çok fazla çöp obje üretmiyorsa(hafızayı şişirmiyorsak) o zaman GC devreye hicbir zaman girmeyebilir ve tabii o zaman da finalize metoduda çağrılmaz.

Ekmek objesinin finalize() methodu  ve kullanığımız üç adet vitamin objesinin finalize() methodları çağrıldı . Bu üç adet vitamin objesinin finalize() methodlarının çağrılmasının sebebi daha evvelden belirttiğim gibi composition yöntemi ile class lara dahil edilmeleri . Peki neden Bugday ve Un objelerinin finalize() methodları çağrılmadı? Bunun sebebi , Ekmek class ının finalize() metodunda  bizim manuel olarak bu class ların finalize()  metodlarını çağırmamızdan kaynaklanıyor . Java bu olayda kontrolu bize vermişdir . Kural şöyle : Eğer türemiş class ın varsa ,   türetilen class ın finalize() methodunu çağırmak senin sorumluluğundadır.
Bir objenin finalize() methodunun çağrılması onun hafızadan atılması anlamına geldiğini bilmemiz gerekir.

Yani  türetilen class ın finalize() methodunun çağrıldığı  şekilde yukarıdaki örneği değiştirelim.  Objelerin hafızadan silenmesi sıralamasına  bakaranız , yaratılma sırasının tam tersi olduğunu göreceksiniz.

 

Dediklerimizi Kod a dökersek :

// kalitim  ve finalize - II
class Vitamin {

    private String isim;

    public Vitamin(String gelen) {
        isim = gelen;
        System.out.println("Vitamin yapilandirici " + isim);
    }

    public void finalize() {
        System.out.println("Vitamin finalize() " + isim);
    }
}

class Bugday {

    Vitamin a = new Vitamin("Bugday");

    public Bugday() {
        System.out.println("Bugday yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Bugday finalize()");
    }
}

class Un extends Bugday {

    Vitamin a = new Vitamin("Un");

    public Un() {
        System.out.println("Un yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Un finalize()");
        super.finalize();
    }
}

class Ekmek extends Un {

    Vitamin a = new Vitamin("Ekmek");

    public Ekmek() {
        System.out.println("Ekmek yapilandirici");
    }

    protected void finalize() throws Throwable {
        System.out.println("Ekmek finalize()");
        super.finalize();
    }
}

public class Firinci2 {

    public static void main(String args[]) {

        new Ekmek();
        System.out.println("Temizlik Basliyor .. ");
        System.gc();
    }
} //^
 

Açıklama: Ekmek ve Un class larının finalize() metodlarına dikkat edelim . Artik super.finalize() sayesinde türetilen  objeninde finalize() methodu da  çağrılıyor.Yangın en aşağıdan başlayarak  başayalarak en yukarıdaki class doğru ilerleyebilir .

Düzenleyen; Hüseyin DUYAN

 

Kaynak: www.programlama.com/sys/c2html/view.php

 

Yorumunuzu Ekleyin

Java Değişken Tipleri

Byte, short, int, long, float, double, boolean, char, string

57,711 Okunma Henüz yorum yapılmamış 04/11/2009 13:11:31

Java Diziler

Javada diziler nesnedirler, cdeki gibi hafızada yer kaplayan pointer değillerdir. Javada diziler, cye göre daha güvenilirdir. Dizilerin elemanlarına gelişigüzel değerler atayamazsınız. Java, dizi elemanlarını sırasıyla kontrol eder. Dolayısıyla arada değer atanmamış bir elemana rastlanırsa hata oluşur. Bu da cde çıkan hafıza bozulmalarını önler. Javada dizi kullanmak için ilk önce dizinin tipi verilir. Tip verilirken dizinin büyüklüğü belirtilmez

55,109 Okunma 2 Yorum 19/11/2007 15:13:25

Javada Fonksiyonlar

Değer alan ve geriye değer döndüren fonksiyonlar

52,838 Okunma Henüz yorum yapılmamış 01/04/2010 14:39:09

Stringleri Karşılaştırma

Stringler bilinen = operatörleri ile karşılaştırılmazlar, ayrıca == ve != operatörleride stringler içindeki karakterleri karşılaştırmazlar

38,580 Okunma Henüz yorum yapılmamış 18/10/2007 12:43:49

Java Da Operatörler

Aritmetik operatorler 4 işlem ve mod, arttırma operatorleri, ilişkisel operatorler, mantıksal operatorler, kısa devre mantıksal operatorler

38,533 Okunma Henüz yorum yapılmamış 02/12/2009 13:58:19

J2ee, j2se, j2me Nedir?

J2ee,j2se,j2me hakkında bilgi

34,027 Okunma 1 Yorum 21/10/2009 17:00:15 16/07/2014 17:00:35

Java Terimleri

Java, birbirinden farklı aygıtlarda çalışabilen, bu aygıtlar arasında iletişimi kolay hale getiren programlama dili ve platformudur. Java diliyle yazılmış programlar, Windows, UNIX, Mac işletim sistemi yüklü bilgisayarlarda hiç bir değişiklik yapmayı gerektirmeden çalışabilmektedirler

33,434 Okunma Henüz yorum yapılmamış 16/10/2007 13:23:36

Javada Diziler

Java da diziler nesnedir; içerisinde belirli sayıda eleman bulunur. Eğer bu sayı sıfır ise, dizi boş demektir. Dizinin içerisindeki elemanlara eksi olmayan bir tam sayı ile ifade edilen dizi erişim indisi ile erişilir. Bir dizide n tane eleman varsa dizinin uzunluğu da n kadardır; ilk elemanın indisi/konumu 0’dan başlar, son elemanı ise n-1’dir.

29,053 Okunma 1 Yorum 14/04/2008 11:01:20

for Döngüsü

27,544 Okunma Henüz yorum yapılmamış 30/12/2009 11:02:00

Java 3D

Son yıllarda çoklu ortamda ilerleme kaydeden Java, Java3D ile yüksek performans isteyen üç boyutlu grafiklerde de 'Ben varım!' diyor.

26,023 Okunma Henüz yorum yapılmamış 26/01/2009 22:23:10

while döngüsü

Dizilerin olmazsa olmazı

25,634 Okunma Henüz yorum yapılmamış 17/12/2009 10:53:28

Java Operatörleri

Mod Operatörü, Aritmetik Atama Operatörü, Arttırma Azaltma Operatörleri, Iliskisel Operatorler ve Kısa Devre Iliskisel Operatörler, Kısa devre iliskisel operatorler, ? Operatoru

25,582 Okunma Henüz yorum yapılmamış 04/12/2009 12:11:34

Yükleniyor...