Java'daki try-with-resources'un ana görevi kaynakların otomatik ve doğru bir şekilde serbest bırakılmasıdır. Bu yapı Java 7'de ortaya çıkmadan önce, programcıların kaynakları manuel olarak finally bloğunda kapatmaları gerekiyordu. Bu, kodun tekrarlanmasına ve sık hatalara yol açıyordu.
Java 6 ve altındaki sürümlerde, kaynakları (açık dosyalar, akışlar, bağlantılar) manuel olarak finally ile yönetmek gerekiyordu, bu da sıklıkla bellek sızıntısına yol açıyordu.
Manuel olarak yazılan kaynak kapatma kodu, özellikle birden fazla istisna ve karmaşık bir catch bloğu hiyerarşisi ile çalışırken hata kaynaklarıdır. Hatalar oluştuğunda close() çağrılma garantisi yoktur.
Java 7 ile birlikte kaynakların otomatik olarak close() metodunun her bir kaynak için çağrılmasını garanti eden try-with-resources sözdizimi ortaya çıktı, bu, AutoCloseable arayüzünü uygulayan her kaynak için geçerlidir.
Kod örneği:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader otomatik olarak kapatılır
Ana özellikler:
Soru 1: Try-with-resources için bir kaynağın hangi arayüzü uygulaması gerekir?
AutoCloseable. Bu arayüzü uygulayan (veya Closeable) her nesne bu yapıda kullanılabilir.
Soru 2: Eğer try-with-resources'ta birden fazla kaynak varsa, hangisi hangi sırayla kapatılır?
Kaynaklar bildirildikleri sıranın tersinde (yığın-LIFO) kapatılır:
try (A a = new A(); B b = new B()) { ... } // önce b.close() çağrılacak, ardından a.close()
Soru 3: Try-with-resources'ı AutoCloseable uygulanmamış, örneğin bir ağ bağlantısı için kullanmak mümkün mü?
Hayır, ancak kendi sınıfınızda AutoCloseable'ı manuel olarak uygulayabilirsiniz. Sonrasında nesne try-with-resources ile uyumlu hale gelir.
Geliştiriciler JDBC Bağlantısı ve Statement'ı finally ile manuel olarak kapatıyordu. İkinci bir istisna durumunda, Statement kapatma işlemi gerçekleşmedi, bağlantı "asılı kaldı" ve hatayı gizledi.
Artılar:
Eksiler:
Dosya yükleme modülünde try-with-resources uygulamasından sonra tüm akışlar otomatik olarak kapatılıyor, kod çok daha kısa hale geldi, dosya tanıtıcı sızıntı hataları ortadan kalktı.
Artılar:
Eksiler: