Panduan Komprehensif untuk Keamanan Null di Kotlin

1. Ikhtisar

Dalam artikel ini, kita akan melihat fitur keamanan null yang dibangun ke dalam bahasa Kotlin. Kotlin menyediakan penanganan native yang komprehensif untuk kolom nullable - tidak diperlukan library tambahan.

2. Ketergantungan Maven

Untuk memulai, Anda harus menambahkan dependensi kotlin-stdlib Maven ke pom.xml Anda :

 org.jetbrains.kotlin kotlin-stdlib 1.1.1  

Anda dapat menemukan versi terbaru di Maven Central.

3. Jenis Referensi Nullable dan Non-Nullable

Kotlin memiliki dua jenis referensi yang diinterpretasikan oleh compiler untuk memberikan informasi kepada programmer tentang ketepatan program pada waktu kompilasi - yang nullable dan yang tidak.

Secara default, Kotlin mengasumsikan bahwa nilai tidak boleh null :

var a: String = "value" assertEquals(a.length, 5)

Kami tidak dapat menetapkan null ke referensi a , dan jika Anda mencobanya, itu akan menyebabkan kesalahan kompilator.

Jika kita ingin membuat referensi nullable, kita perlu menambahkan tanda tanya (?) Ke definisi tipe :

var b: String? = "value"

Setelah itu, kita dapat menetapkan null untuk itu:

b = null

Saat kita ingin mengakses referensi b , kita harus menangani kasus null secara eksplisit untuk menghindari kesalahan kompilasi karena Kotlin tahu bahwa variabel ini dapat menampung null :

if (b != null) { println(b.length) } else { assertNull(b) }

4. Panggilan Aman

Menangani setiap referensi nullable dengan cara seperti itu bisa jadi merepotkan. Untungnya, Kotlin memiliki sintaks untuk "panggilan aman" - sintaks ini memungkinkan pemrogram untuk mengeksekusi tindakan hanya jika referensi tertentu memiliki nilai bukan nol .

Mari kita tentukan dua kelas data untuk menggambarkan fitur ini:

data class Person(val country: Country?) data class Country(val code: String?)

Perhatikan bahwa bidang negara dan kode adalah tipe referensi nullable.

Untuk mengakses bidang tersebut dengan cara yang lancar, kita dapat menggunakan sintaks panggilan aman:

val p: Person? = Person(Country("ENG")) val res = p?.country?.code assertEquals(res, "ENG")

Jika variabel p bernilai nol , sintaks panggilan aman akan mengembalikan hasil nol :

val p: Person? = Person(Country(null)) val res = p?.country?.code assertNull(res)

4.1. Metode let ()

Untuk mengeksekusi tindakan hanya ketika referensi memiliki nilai non-nullable, kita dapat menggunakan operator let .

Katakanlah kita memiliki daftar nilai dan ada juga nilai null dalam daftar itu:

val firstName = "Tom" val secondName = "Michael" val names: List = listOf(firstName, null, secondName)

Selanjutnya, kita dapat menjalankan tindakan pada setiap elemen non-nullable dari daftar nama dengan menggunakan fungsi let :

var res = listOf() for (item in names) { item?.let { res = res.plus(it) } } assertEquals(2, res.size) assertTrue { res.contains(firstName) } assertTrue { res.contains(secondName) }

4.2. Metode juga ()

Jika kita ingin menerapkan beberapa operasi tambahan, misalnya mencatat setiap nilai non-nullable kita dapat menggunakan metode juga () dan menggabungkannya dengan let ():

var res = listOf() for (item in names) { item?.let { res = res.plus(it); it } ?.also{it -> println("non nullable value: $it")} }

Ini akan mencetak setiap elemen yang bukan null:

non nullable value: Tom non nullable value: Michael

4.3. Metode run ()

Kotlin memiliki metode run () untuk menjalankan beberapa operasi pada referensi nullable. Ini sangat mirip dengan let () tetapi di dalam tubuh fungsi, Metode Run () beroperasi pada referensi ini alih-alih parameter fungsi:

var res = listOf() for (item in names) { item?.run{res = res.plus(this)} }

5. Operator Elvis

Terkadang, ketika kita memiliki referensi, kita ingin mengembalikan beberapa nilai default dari operasi jika referensi tersebut bernilai null . Untuk mencapai itu, kita dapat menggunakan operator elvis ( ? :). Ini setara dengan orElse / orElseGet dari Java kelas Opsional :

val value: String? = null val res = value?.length ?: -1 assertEquals(res, -1)

Jika referensi nilai memiliki nilai yang tidak dapat dinolkan, panjang metode akan dipanggil:

val value: String? = "name" val res = value?.length ?: -1 assertEquals(res, 4)

6. Dapatkan Tidak Aman Nullable

Kotlin also has an unsafe operator to get a value of a nullable field without handling absence logic explicitly, but it should be used very carefully.

The double exclamation mark operator (!!) takes a value from a nullable reference and throws a NullPointerException if it holds null. This is an equivalent of Optional.get() operation:

var b: String? = "value" b = null assertFailsWith { b!! }

If the nullable reference holds a non-nullable value, the action on that value will be executed successfully:

val b: String? = "value" assertEquals(b!!.length, 5)

7. Filtering Null Values From a List

The List class in Kotlin has a utility method filterNotNull() that returns only non-nullable values from a list that holds nullable references:

val list: List = listOf("a", null, "b") val res = list.filterNotNull() assertEquals(res.size, 2) assertTrue { res.contains("a") } assertTrue { res.contains("b") }

Ini adalah konstruksi yang sangat berguna yang merangkum logika yang seharusnya kita butuhkan untuk mengimplementasikan diri kita sendiri.

8. Kesimpulan

Pada artikel ini, kami menjelajahi fitur keamanan nol Koltin secara mendalam. Kami melihat jenis referensi yang dapat menampung nilai null dan yang tidak bisa. Kami menerapkan logika penanganan nol yang lancar dengan menggunakan fitur "panggilan aman" dan operator elvis .

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub - ini adalah proyek Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.