1 puan yazan GN⁺ 2024-08-04 | 1 yorum | WhatsApp'ta paylaş

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 String türündeki bir değişken, bir String nesnesi 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ür
  • Foo?, null içeren null izinli türdür
  • Varsayılan olarak Foo iç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 NullPointerException oluş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!.class veya Foo?.class literalleri 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çerir
  • java.lang.reflect.Type ve javax.lang.model API'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

 
GN⁺ 2024-08-04
Hacker News görüşleri
  • C# ve Kotlin'in null işleme yaklaşımlarının karşılaştırılması

    • C#'ta projede nullability etkinleştirildiğinde tüm değişkenler varsayılan olarak non-null olarak bildirilir
    • Kotlin de benzer, ancak geriye dönük uyumluluk gereksinimi yoktur
    • Kotlin, lateinit var bildirimiyle başlatılmamış non-nullable değişkenlerin daha sonra başlatılabilmesini sağlar
  • Yeni öneri hakkındaki görüşler

    • Mevcut değişkenler nullable, açıkça nullable ve açıkça non-nullable olarak ayrılıyor
    • Özellikle legacy codebase'lerde nullability sorunlarını çözme zorunluluğu olmaması açısından C# yaklaşımı daha iyi görünüyor
    • Ancak C# yaklaşımı, codebase içindeki nullability sorunlarını hemen görünür kılıyor
  • nullness-narrowing otomatik dönüşümüyle ilgili endişeler

    • Otomatik dönüşüm yanlış bir his veriyor
    • Bazı durumlarda derleyici hatası üretilmesi gerekir
    • Açık dönüşüm daha güvenlidir
  • Tüm değişkenleri varsayılan olarak non-null olarak işaretleme yöntemine duyulan ihtiyaç

    • Paket veya dosya düzeyinde tüm değişkenleri non-null olarak işaretleyebilecek bir yönteme ihtiyaç var
    • Aksi halde neredeyse her değişkende T! sözdizimini kullanmak gerekir ve bu da kodu karmaşıklaştırır
  • Java'da dil düzeyinde açık optionality özelliğine duyulan ihtiyaç

    • Kotlin ve TypeScript deneyimine göre dil düzeyindeki destek daha iyidir
    • Java'daki NullAway gibi araçlar zahmetlidir
  • Dil iyileştirmelerini standart kütüphaneye uygulamama kararısına yönelik eleştiri

    • PHP kullanım deneyiminde standart kütüphaneyle etkileşim zahmetliydi
    • Bu ifade gücünün standart kütüphaneye de eklenmesi gerekiyor
  • Derleme zamanı uyarılarını hataya yükseltmenin kolay bir yoluna duyulan ihtiyaç

    • Java ağırlıklı olarak statik tipli bir dil olduğundan dinamik davranışlar eklemek iyi değildir
  • Varsayılan olarak non-nullable, immutable ve dar kapsamlı ayarlara duyulan ihtiyaç

    • Yeni tasarım kararları çoğu zaman anlık kolaylık uğruna güvenli yolu terk ediyor
    • Birçok dil ve teknolojide bu sorunlar nedeniyle çok sayıda hata ortaya çıkıyor
  • Hack dilindeki null işleme deneyimi

    • Hack'in tip sisteminde nullness önemli bir parçadır
    • Nullable dizilerle ilgili soru
    • Java'da tüm legacy kod nullability varsaydığı için bu bir sorun haline geliyor
  • Bu özelliğin Java SDK'ya uygulanıp uygulanamayacağına dair soru

    • Legacy koda bunun nasıl uygulanabileceği konusunda soru işaretleri var
  • İlgili bağlantılar