1 poin oleh GN⁺ 2024-08-04 | 1 komentar | Bagikan ke WhatsApp

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 null atau tidak
  • Mendukung konversi antar tipe dengan atribut nullness yang berbeda, serta memberikan peringatan untuk nilai null yang 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 null saat 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 null ditangani secara eksplisit
  • Tidak mencakup perubahan pada tipe primitif
  • Tidak menerapkan peningkatan bahasa ini ke pustaka standar

Motivasi

  • Dalam program Java, variabel bertipe String dapat berisi referensi objek String atau nilai null
  • 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 null didukung atau diharapkan

Penjelasan

Atribut nullness dan penanda

  • Tipe referensi dapat menyatakan nullness secara opsional
  • Foo! adalah tipe null-restricted yang tidak mencakup null
  • Foo? adalah tipe nullable yang mencakup null
  • Secara default, nullness dari Foo tidak 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 NullPointerException saat runtime

Pemeriksaan null saat runtime

  • Ketika narrowing nullness conversion terjadi, NullPointerException akan 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 NullRestricted yang baru menunjukkan bahwa suatu field tidak mengizinkan nilai null

Refleksi inti

  • Literal Foo!.class atau Foo?.class tidak ada
  • API RuntimeType yang baru menjelaskan varian null-restricted saat runtime

Perubahan tambahan

  • Serialisasi tradisional tidak kompatibel dengan field dan array null-restricted
  • javadoc menyertakan penanda nullness
  • API java.lang.reflect.Type dan javax.lang.model mengodekan 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 null secara lebih jelas sehingga meningkatkan stabilitas dan keterbacaan kode
  • Dengan memperkenalkan tipe null-restricted dan nullable, bug akibat referensi null dapat 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 null dapat diperkuat
  • Salah satu alat dengan fungsi serupa adalah fitur null-safety milik Kotlin

1 komentar

 
GN⁺ 2024-08-04
Komentar Hacker News
  • Perbandingan cara C# dan Kotlin menangani null

    • C# mendeklarasikan semua variabel sebagai non-null secara default ketika nullability diaktifkan di proyek
    • Kotlin mirip, tetapi tidak perlu mempertimbangkan kompatibilitas ke belakang
    • Kotlin menyediakan fitur untuk menginisialisasi belakangan variabel non-nullable yang belum diinisialisasi melalui deklarasi lateinit var
  • Pendapat tentang proposal baru

    • Variabel yang sudah ada dibedakan menjadi nullable, explicitly nullable, dan explicitly non-nullable
    • Pendekatan C# tampak lebih baik, terutama karena tidak perlu menyelesaikan masalah nullability di codebase lawas
    • Namun, pendekatan C# langsung menyoroti masalah nullability di codebase
  • Kekhawatiran tentang konversi otomatis nullness-narrowing

    • Konversi otomatis memberi kesan yang keliru
    • Ada kasus yang seharusnya memunculkan error kompilator
    • Konversi eksplisit lebih aman
  • Perlunya cara untuk menandai semua variabel sebagai non-null secara default

    • Diperlukan cara untuk menandai semua variabel sebagai non-null pada tingkat paket atau file
    • Jika tidak, sintaks T! akan dipakai pada hampir semua variabel sehingga kode menjadi rumit
  • Perlunya fitur optionality eksplisit di tingkat bahasa pada Java

    • Berdasarkan pengalaman dengan Kotlin dan Typescript, dukungan di tingkat bahasa lebih baik
    • Alat seperti NullAway di Java terasa merepotkan
  • Kritik terhadap keputusan untuk tidak menerapkan peningkatan bahasa ke pustaka standar

    • Berdasarkan pengalaman memakai PHP, interaksi dengan pustaka standar terasa merepotkan
    • Perlu menambahkan daya ekspresif semacam ini ke pustaka standar
  • Perlunya cara mudah untuk menaikkan peringatan waktu kompilasi menjadi error

    • Karena Java pada dasarnya adalah bahasa bertipe statis, memperkenalkan perilaku dinamis bukan ide yang baik
  • Perlunya menjadikan non-nullable, immutable, dan cakupan sempit sebagai default

    • Banyak keputusan desain baru sering mengorbankan jalur aman demi kemudahan langsung
    • Banyak bahasa dan teknologi menghasilkan banyak bug karena masalah ini
  • Pengalaman penanganan null di bahasa Hack

    • Nullness adalah bagian penting dari sistem tipe Hack
    • Ada pertanyaan tentang array nullable
    • Di Java, ini menjadi masalah karena semua kode lawas mengasumsikan nullability
  • Pertanyaan apakah fitur ini bisa diterapkan ke Java SDK

    • Muncul pertanyaan bagaimana ini bisa diterapkan ke kode lawas
  • Tautan terkait