Java’da Finalizer Metodu

Şub 23rd, 2010 | Yazar: Özcan Acar | Kategori: Püf Noktası

Java_tr grubunda aşağıdaki yer alan soru soruldu. Bu soru ve benim bu konudaki düşüncelerim aşağıda yer almaktadır.

Java’da bulmaca sevenlere; Aşağıda ki kod parçası için çıktı ne olur,
“finalized” yazar mı? Constructor’ýnda exception fırlatmış bir nesnenin
finalize işleminden geçmesini bekler misiniz?


public class FinalizerTest {

<span id="more-1098"></span>

  public FinalizerTest() {
    System.out.println("constructed");
    throw new RuntimeException();
  }

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

  public static void main(String[] args) {
    try {
      new FinalizerTest();
    } catch (Exception e) {
      System.out.println("exception");
    }
    System.gc();
  }
}

Benim verdiğim cevap şu şekildedir:


Java’da finalize() kullanılması doğru değildir, çünkü JVM’in finalize metodunu ne zaman koşturacağını kestirmek mümkün değildir. Buna güvenerek örneğin finalize() içinde kullanılan kaynakları serbest bırakmak yapılabilecek en büyük hatalardan birisidir. Pratikte finalize() metodu kesinlikle kullanmamalıdır. Finalizer kullanımı performansı düşürür. Finalizer ile nesnenin yok edilmesi daha uzun zaman alır. Finalize yerine bir terminasyon metodu kullanılmalıdır. gc() metodunun kullanımı da GC nin hemen devreye gireceği garantisini vermez.

Yukarıda yer alan programın konstruktöründe try catch ile hata yakalanarak, daha önce bahsettiğim terminasyon metodu (örneğin myExit()) koşturulmalıdır.


EOF ( End Of Fun)
Özcan Acar

Püf Noktası kategorisinden son 5 yazı

  • Share/Bookmark

4 yorum | 2.490 kez okundu | yazdır yazdır

 
1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (Değerlendirme bulunmuyor)
Loading ... Loading ...

RSS feed | Trackback URI

4 Yorum »

Yorum yapan: Pamir Erdem
2010-02-24 23:06:25

finalize kullanımınının kötü olması kadar System.gc()’nin de kullanılması o kadar kötüdür. Hatta mümkünse kullanmayın.

 
Yorum yapan: yasin
2010-02-24 23:18:07

En son paragrafta “aşağıdaki” yazmışsınız ama aşağıda bir program yok. “yukarıdaki” mi demek istediniz?

Yorum yapan: acar
2010-02-24 23:26:32

dogrudur, degistirdim :)

 
 
Yorum yapan: elessar
2010-05-10 23:01:43

Yalniz soruda kodun çıktısı da sorulmuş, bulmaca olarak. kod sadece
constructed
exception
yazar ve biter. zaten nesne oluşturulamadığı için finalized çalışmaz.

 
İsim (gerekli)
E-posta (gerekli - kimseye gösterilmez)
Websayfanız
Sizin yorumunuz (küçült | büyüt)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> kullanabilirsiniz.

Trackback Listesi