Başlıca noktaların özeti
- Java’nın checked exception’ları, toplulukta yaygın biçimde eleştirilen bir özellik olmasına rağmen tür güvenliği açısından güçlü avantajlar sunuyor.
- Kavramsal olarak Rust’ın
Result<T, E> veya Haskell’in Either a b yapısına benzer bir tür güvenliği mekanizması sağlıyor.
- Checked exception’lar, metot imzasında olası başarısızlık ihtimalini açıkça ifade ederek tür sistemi üzerinden hata işlemenin zorunlu olmasını sağlıyor.
Checked exception’ların avantajları
- Derleme zamanında exception işlenip işlenmediğini denetleyerek tür güvenliği sağlıyor.
- Metot imzasında
throws bölümüyle exception olasılığını belirterek bunu API sözleşmesinin bir parçası haline getiriyor.
- Yalnızca bildirimle exception’ın otomatik olarak yukarı taşınmasını sağlayan kullanışlı bir mekanizma sunuyor.
- Rust’tan farklı olarak her çağrıda
? operatörü gibi ek sözdizimi gerektirmiyor.
Checked exception’ların sorunları
- Çağrı zincirinde aşırı boilerplate kod oluşmasına yol açıyor.
- Java 8 sonrasında gelen lambda ve Stream API gibi işlevsel programlama özellikleriyle uyumluluğu zayıf.
- Bir interface’e yeni exception eklenmesi, uyumluluğu bozduğu için API’nin evrimini zorlaştırıyor.
- Exception’ı görmezden gelme anti-pattern’lerini teşvik etme riski taşıyor.
İyileştirme önerileri
- Lambda’ların checked exception bildirebilmesi için functional interface’lerin geliştirilmesi.
throws bölümüne generic exception türü desteği eklenmesi.
- İşlevsel bağlamlarda checked exception’ların daha iyi ele alınabilmesi için API’nin genişletilmesi.
Optional<T> ve Stream<T> API’leriyle daha iyi entegrasyon sağlanması.
Diğer dillerle karşılaştırma
- Rust:
Result<T, E> ve ? operatörü üzerinden açık hata işleme mekanizması sunuyor.
- Kotlin: Tüm exception’ları unchecked hale getirdi, ancak
runCatching gibi işlevsel yapılar sunuyor.
- Scala:
Try[T], Either[A, B] gibi monadik türler üzerinden işlevsel hata işlemeyi destekliyor.
Sonuç
- Checked exception’lar, Java’nın yanlış anlaşılan yenilikçi bir özelliği olarak yeniden değerlendirmeyi hak ediyor.
- Tamamen vazgeçmek yerine, modern Java özellikleriyle daha uyumlu olacak şekilde iyileştirilmesi daha doğru olur.
- Mevcut paradigmayı korurken pratik sorunları çözecek yönde gelişme potansiyeli bulunuyor.
- Tür güvenliği, kod sadeliği ve esneklik arasında denge kurmak önemli.
1 yorum
Sanki onlarca yıldır konuşulan tartışmayı tekrar ediyormuşuz gibi hissettim. Bu, Exception'ın da Type kadar değerli olduğu iddiası gibi geliyor; ben ise Type'ın yeterli olduğunu söylemek istiyorum.