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

advertisement
Java Class Yapısında Finalize Metotunun Kullanımı
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");
www.dersmax.com
Java Class Yapısında Finalize
Metotunun Kullanımı
1
Java Class Yapısında Finalize Metotunun Kullanımı
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
www.dersmax.com
Java Class Yapısında Finalize
Metotunun Kullanımı
2
Java Class Yapısında Finalize Metotunun Kullanımı
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();
}
}
www.dersmax.com
Java Class Yapısında Finalize
Metotunun Kullanımı
3
Java Class Yapısında Finalize Metotunun Kullanımı
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 .
Hüseyin DUYAN
Kaynak;
http://www.programlama.com/sys/c2html/view.php?DocID=36
www.dersmax.com
Java Class Yapısında Finalize
Metotunun Kullanımı
4
Download