Null Kısıtlı ve Null İzinli Türler
(bugs.openjdk.org)Null-Restricted and Nullable Types (Preview)
Özet
Java türlerinde null kabul eden veya reddeden nullness işaretleyicilerini destekleyen önizleme dil özelliği.
Hedefler
- Java'nın başvuru türlerini geliştirerek programcıların null başvurusu bekleyip beklemediğini ifade edebilmesini sağlamak
- Farklı nullness özelliklerine sahip türler arasında dönüşümü desteklemek ve hatalı işlenen null değerler için uyarılar sunmak
- Mevcut Java koduyla uyumlu olmak ve yeni özelliğin kademeli olarak benimsenmesini desteklemek
- Null reddeden türlerdeki değişkenlerin ilk okunmalarından önce başlatılmasını garanti etmek
- Ayrı derlenmiş sınıflarda bile null reddeden türleri çalışma zamanında zorunlu kılmak
- Çalışma zamanı optimizasyonu için gerekli meta veriyi ve bütünlük güvencelerini sağlamak
Hedef Dışı
- Mevcut kodu otomatik olarak yeniden yorumlamamak
- Tüm null değerlerin açıkça ele alınmasını zorunlu kılmamak
- İlkel türlere ilişkin değişiklikleri içermemek
- Dil iyileştirmelerini standart kütüphaneye uygulamamak
Motivasyon
- Java programlarında
Stringtüründeki bir değişken, birStringnesnesi başvurusu ya da null değeri taşıyabilir - Bir değişkenin null kabul edip etmeyeceği açıkça ifade edilemediğinden karışıklık ve hatalar oluşabilir
- Geliştiricilerin bir türün parçası olarak null değerleri destekleyip desteklemediğini ya da bekleyip beklemediğini belirtebileceği araçlara ihtiyaç vardır
Açıklama
Nullness özellikleri ve işaretleyiciler
- Başvuru türleri nullness'i isteğe bağlı olarak ifade edebilir
Foo!, null içermeyen null-kısıtlı türdürFoo?, null içeren null izinli türdür- Varsayılan olarak
Fooiçin nullness belirtilmemiştir
Alan ve dizi başlatma
- Null-kısıtlı alanlar veya diziler kullanılmadan önce mutlaka başlatılmalıdır
- Başlatılmamış null-kısıtlı bir alan okunursa istisna oluşur
İfade nullness'i ve dönüşümler
- Java derleyicisi her ifadenin nullness'ini belirler
- Nullness dönüşümleri sayesinde farklı nullness'e sahip ifadeler ele alınabilir
- Daraltıcı nullness dönüşümleri çalışma zamanında
NullPointerExceptionüretebilir
Çalışma zamanı null denetimi
- Daraltıcı nullness dönüşümü gerçekleştiğinde
NullPointerExceptionoluşur
Tür değişkenlerinin nullness'i
- Tür değişkenleri de nullness ifade edebilir
- Null-kısıtlı ve null izinli tür değişkenleri, generic kod içinde belirli nullness varsayımlarını ifade eder
Tür bağımsız değişkenleri ve sınırlar
- Tür bağımsız değişkenleri nullness ifade edebilir ve bu API'nin nullness'ini etkiler
- Nullness'i uyuşmayan tür bağımsız değişkenleri uyarı üretebilir
Metot override etme ve tür bağımsız değişkeni çıkarımı
- Nullness, metot imzalarının aynı olup olmadığını belirlerken göz ardı edilir
- Override edilen metotların dönüş türleri nullness dönüşümleriyle dönüştürülebilir
Derleyici uyarıları
- Null-kısıtlı türler oluşturmak yeni derleme zamanı hatalarına yol açabilir
- Daraltıcı nullness dönüşümleri, null-hostile işlemlerde
?türünün kullanımı vb. durumlar uyarı üretebilir
Derleme ve sınıf dosyası gösterimi
- Null işaretleyicilerinin çoğu sınıf dosyalarında kaldırılır
- Yeni
NullRestrictedözniteliği, bir alanın null değere izin vermediğini gösterir
Çekirdek yansıma
Foo!.classveyaFoo?.classliteralleri yoktur- Yeni RuntimeType API'si, çalışma zamanında null-kısıtlı varyantları açıklar
Tamamlayıcı değişiklikler
- Geleneksel serileştirme, null-kısıtlı alanlar ve dizilerle uyumlu değildir
javadoc, nullness işaretleyicilerini içerirjava.lang.reflect.Typevejavax.lang.modelAPI'leri nullness'i kodlar
Alternatifler
- Java ekosistemindeki çeşitli geliştirme araçları null takibini kendi başına uygular
- Diğer programlama dilleri nullness'i tür sisteminde takip eder
- Çalışma zamanında nullness zorlaması, açık denetimlerle veya
Objects.requireNonNullçağrılarıyla uygulanabilir
Bağımlılıklar
- Flexible Constructor Bodies (Second Preview) gereklidir
- Null-Restricted Value Class Types (Preview) ve JEP 402: Enhanced Primitive Boxing (Preview) gibi gelecekteki çalışmalarla bağlantılıdır
GN⁺ Özeti
- Bu JEP, Java'da null değerleri açık biçimde ele almayı sağlayan araçlar sunarak kodun kararlılığını ve okunabilirliğini artırır
- Null-kısıtlı ve null izinli türlerin tanıtılması, null başvurularından kaynaklanan hataları azaltabilir
- Mevcut kodla uyumludur ve kademeli olarak benimsenebilir; bu da geliştiricilere esneklik sağlar
- Diğer dillerle karşılaştırıldığında Java'nın null işleme yeteneklerini güçlendirebilir
- Benzer işlev sunan araçlar arasında Kotlin'in null-safety özelliği bulunur
1 yorum
Hacker News görüşleri
C# ve Kotlin'in
nullişleme yaklaşımlarının karşılaştırılmasılateinit varbildirimiyle başlatılmamış non-nullable değişkenlerin daha sonra başlatılabilmesini sağlarYeni öneri hakkındaki görüşler
nullness-narrowingotomatik dönüşümüyle ilgili endişelerTüm değişkenleri varsayılan olarak non-null olarak işaretleme yöntemine duyulan ihtiyaç
T!sözdizimini kullanmak gerekir ve bu da kodu karmaşıklaştırırJava'da dil düzeyinde açık optionality özelliğine duyulan ihtiyaç
Dil iyileştirmelerini standart kütüphaneye uygulamama kararısına yönelik eleştiri
Derleme zamanı uyarılarını hataya yükseltmenin kolay bir yoluna duyulan ihtiyaç
Varsayılan olarak non-nullable, immutable ve dar kapsamlı ayarlara duyulan ihtiyaç
Hack dilindeki
nullişleme deneyiminullnessönemli bir parçadırnullabilityvarsaydığı için bu bir sorun haline geliyorBu özelliğin Java SDK'ya uygulanıp uygulanamayacağına dair soru
İlgili bağlantılar