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
Java kategorisinden son yazılar
- Java 9 ile Modül Bazlı Yazılım - February 3rd, 2018
- 2015 Yılına Geldik, Hala Spring’le Birlikte İnterface sınıf mı Kullanmak Zorundayız? - May 23rd, 2015
- JVM Nasıl Çalışır Yazı Serisi - Java Dilinde Neden Göstergeçler (Pointer) Yok? - December 30th, 2014
- JVM Nasıl Çalışır Yazı Serisi - Java String Nesnelerinin Hafıza Kullanımı Nasıl Azaltılır? - September 18th, 2014
- Java’ya Nereden Başlamalıyım? - April 2nd, 2014
- java.lang.IncompatibleClassChangeError: Implementing class Nedir ve Analizi Nasıl Yapılır? - March 15th, 2014
- Yazılımcının Verimliliğini Artıran Eclipse Ayarları - January 1st, 2014
- Java Generics Get ve Put Prensibi - January 30th, 2013
- Uzaktan Eşli Programlama - September 30th, 2012
- Sorumluluk Sahibi Olmak - August 20th, 2012
Pamir Erdem
24 Şubat 2010finalize 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 2010En son paragrafta “aşağıdaki” yazmışsınız ama aşağıda bir program yok. “yukarıdaki” mi demek istediniz?
acar
24 Şubat 2010dogrudur, degistirdim :)
elessar
10 Mayıs 2010Yalniz soruda kodun çıktısı da sorulmuş, bulmaca olarak. kod sadece
constructed
exception
yazar ve biter. zaten nesne oluşturulamadığı için finalized çalışmaz.