Tipe yang Membatasi Null dan Tipe Nullable
(bugs.openjdk.org)Null-Restricted and Nullable Types (Preview)
Ringkasan
Fitur bahasa pratinjau yang mendukung penanda nullness untuk mengizinkan atau menolak null pada tipe Java.
Tujuan
- Meningkatkan tipe referensi Java agar programmer dapat menyatakan apakah mereka mengharapkan referensi
nullatau tidak - Mendukung konversi antar tipe dengan atribut nullness yang berbeda, serta memberikan peringatan untuk nilai
nullyang ditangani secara tidak tepat - Tetap kompatibel dengan kode Java yang ada dan mendukung adopsi fitur baru secara bertahap
- Menjamin bahwa variabel bertipe null-restricted diinisialisasi sebelum pertama kali dibaca
- Memaksakan tipe yang menolak
nullsaat runtime, bahkan pada class yang dikompilasi secara terpisah - Menyediakan metadata dan jaminan integritas yang diperlukan untuk optimasi runtime
Bukan tujuan
- Tidak menafsirkan ulang kode yang sudah ada secara otomatis
- Tidak mewajibkan semua nilai
nullditangani secara eksplisit - Tidak mencakup perubahan pada tipe primitif
- Tidak menerapkan peningkatan bahasa ini ke pustaka standar
Motivasi
- Dalam program Java, variabel bertipe
Stringdapat berisi referensi objekStringatau nilainull - Tidak ada cara yang jelas untuk menyatakan apakah sebuah variabel boleh menerima
null, sehingga menimbulkan kebingungan dan bug - Diperlukan alat yang memungkinkan developer menyatakan sebagai bagian dari tipe apakah nilai
nulldidukung atau diharapkan
Penjelasan
Atribut nullness dan penanda
- Tipe referensi dapat menyatakan nullness secara opsional
Foo!adalah tipe null-restricted yang tidak mencakupnullFoo?adalah tipe nullable yang mencakupnull- Secara default, nullness dari
Footidak ditentukan
Inisialisasi field dan array
- Field atau array null-restricted harus diinisialisasi sebelum digunakan
- Jika field null-restricted yang belum diinisialisasi dibaca, akan terjadi exception
Nullness ekspresi dan konversi
- Kompiler Java menentukan nullness dari setiap ekspresi
- Konversi nullness memungkinkan penanganan ekspresi dengan nullness yang berbeda
- Narrowing nullness conversion dapat memicu
NullPointerExceptionsaat runtime
Pemeriksaan null saat runtime
- Ketika narrowing nullness conversion terjadi,
NullPointerExceptionakan dilempar
Nullness pada variabel tipe
- Variabel tipe juga dapat menyatakan nullness
- Variabel tipe null-restricted dan nullable menyatakan nullness tertentu di dalam kode generik
Argumen tipe dan batasan
- Argumen tipe dapat menyatakan nullness, dan ini memengaruhi nullness API
- Argumen tipe dengan nullness yang tidak cocok dapat memunculkan peringatan
Method overriding dan inferensi argumen tipe
- Nullness diabaikan saat menentukan apakah signature method sama atau tidak
- Tipe nilai balik dari method overriding dapat dikonversi melalui konversi nullness
Peringatan kompiler
- Membuat tipe null-restricted dapat menimbulkan error compile-time baru
- Narrowing nullness conversion, penggunaan tipe
?pada operasi yang tidak ramah terhadap null, dan sebagainya dapat memunculkan peringatan
Kompilasi dan representasi file class
- Sebagian besar penanda null dihapus dari file class
- Atribut
NullRestrictedyang baru menunjukkan bahwa suatu field tidak mengizinkan nilainull
Refleksi inti
- Literal
Foo!.classatauFoo?.classtidak ada - API
RuntimeTypeyang baru menjelaskan varian null-restricted saat runtime
Perubahan tambahan
- Serialisasi tradisional tidak kompatibel dengan field dan array null-restricted
javadocmenyertakan penanda nullness- API
java.lang.reflect.Typedanjavax.lang.modelmengodekan nullness
Alternatif
- Berbagai alat pengembang dalam ekosistem Java telah mengimplementasikan pelacakan null sendiri
- Bahasa pemrograman lain melacak nullness dalam sistem tipe
- Pemaksaan nullness saat runtime dapat diimplementasikan dengan pemeriksaan eksplisit atau pemanggilan
Objects.requireNonNull
Dependensi
- Memerlukan Flexible Constructor Bodies (Second Preview)
- Pekerjaan lanjutan seperti Null-Restricted Value Class Types (Preview) dan JEP 402: Enhanced Primitive Boxing (Preview)
Ringkasan GN⁺
- JEP ini menyediakan alat di Java untuk menangani nilai
nullsecara lebih jelas sehingga meningkatkan stabilitas dan keterbacaan kode - Dengan memperkenalkan tipe null-restricted dan nullable, bug akibat referensi
nulldapat dikurangi - Tetap kompatibel dengan kode yang ada dan dapat diadopsi secara bertahap, sehingga memberi fleksibilitas bagi developer
- Dibandingkan dengan bahasa lain, kemampuan Java dalam menangani
nulldapat diperkuat - Salah satu alat dengan fungsi serupa adalah fitur null-safety milik Kotlin
1 komentar
Komentar Hacker News
Perbandingan cara C# dan Kotlin menangani null
lateinit varPendapat tentang proposal baru
Kekhawatiran tentang konversi otomatis nullness-narrowing
Perlunya cara untuk menandai semua variabel sebagai non-null secara default
Perlunya fitur optionality eksplisit di tingkat bahasa pada Java
Kritik terhadap keputusan untuk tidak menerapkan peningkatan bahasa ke pustaka standar
Perlunya cara mudah untuk menaikkan peringatan waktu kompilasi menjadi error
Perlunya menjadikan non-nullable, immutable, dan cakupan sempit sebagai default
Pengalaman penanganan null di bahasa Hack
Pertanyaan apakah fitur ini bisa diterapkan ke Java SDK
Tautan terkait