Java’da Finalizer Metodu

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

Share Button
0.00 avg. rating (0% score) - 0 votes

4 Comments

  • Pamir Erdem

    24 Şubat 2010

    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.

  • yasin

    24 Şubat 2010

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

  • acar

    24 Şubat 2010

    dogrudur, degistirdim :)

  • elessar

    10 Mayıs 2010

    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.

Bir cevap yazın