Kelas Inline di Kotlin

1. Ikhtisar

Di Kotlin 1.3+, kami memiliki tipe kelas baru eksperimental, yang disebut kelas inline. Dalam tutorial ini, kita akan fokus pada penggunaan kelas inline dan juga beberapa batasannya.

2. Penyiapan

Seperti yang kami sebutkan sebelumnya, kelas inline adalah fitur eksperimental Kotlin. Akibatnya, compiler akan mengeluarkan peringatan yang menunjukkan status eksperimental dari fitur tersebut.

Untuk menghindari peringatan ini, kita dapat menambahkan opsi compiler Maven berikut ke konfigurasi kita:

  -XXLanguage:+InlineClasses  

3. Apakah Kelas Inline itu?

Kelas inline memberi kita cara untuk membungkus suatu tipe, sehingga menambahkan fungsionalitas dan membuat tipe baru dengan sendirinya.

Berbeda dengan pembungkus biasa (tidak sebaris), pembungkus ini akan mendapatkan keuntungan dari peningkatan kinerja. Ini terjadi karena data dimasukkan ke dalam penggunaannya, dan pembuatan instance objek dilewati dalam kode yang dikompilasi yang dihasilkan.

Mari kita lihat contoh kelas inline yang disebut InlinedCircleRadius dengan properti tipe Double yang mewakili radius:

val circleRadius = InlinedCircleRadius(5.5)

Untuk JVM, kode kami sebenarnya hanya:

val circleRadius = 5.5

Perhatikan bagaimana InlinedCircleRadius kami tidak dibuat dalam kode yang dikompilasi karena nilai yang mendasarinya sebaris, membebaskan kami dari penalti kinerja yang terkait dengan pembuatan instance.

3.1. Contoh Penggunaan

Sekarang setelah kita tahu apa itu kelas inline, kita akan membahas penggunaannya.

Properti tunggal yang diinisialisasi di konstruktor utama adalah persyaratan dasar kelas inline . Properti tunggal akan mewakili instance kelas saat runtime.

Oleh karena itu, untuk mendapatkan definisi yang benar, kita dapat menggunakan satu baris kode:

inline class InlineDoubleWrapper(val doubleValue : Double)

Kami mendefinisikan InlineDoubleWrapper sebagai pembungkus sederhana di atas objek Double dan menerapkan kata kunci inline padanya. Akhirnya, sekarang kita dapat menggunakan kelas ini dalam kode kita tanpa perubahan tambahan:

@Test fun whenInclineClassIsUsed_ThenPropertyIsReadCorrectly() { val piDoubleValue = InlineDoubleWrapper(3.14) assertEquals(3.14, piDoubleValue.doubleValue) }

4. Anggota Kelas

Sampai sekarang, kami menggunakan class inline seperti pembungkus sederhana. Tapi mereka lebih dari itu. Mereka juga memungkinkan kita untuk mendefinisikan properti dan fungsi seperti kelas biasa. Contoh berikut ini mendefinisikan properti yang mewakili diameter dan fungsi untuk mengembalikan luas lingkaran:

inline class CircleRadius(private val circleRadius : Double) { val diameterOfCircle get() = 2 * circleRadius fun areaOfCircle = 3.14 * circleRadius * circleRadius }

Sekarang kita akan membuat pengujian untuk properti diameterOfCircle kita . Ini akan membuat instance kelas inline CircleRadius kami dan kemudian memanggil properti:

@Test fun givenRadius_ThenDiameterIsCorrectlyCalculated() { val radius = CircleRadius(5.0) assertEquals(10.0, radius.diameterOfCircle) }

Dan inilah tes sederhana untuk fungsi areaOfCircle :

@Test fun givenRadius_ThenAreaIsCorrectlyCalculated() { val radius = CircleRadius(5.0) assertEquals(78.5, radius.areaOfCircle()) }

Namun, ada beberapa batasan tentang apa yang bisa dan tidak bisa kita definisikan di dalam kelas inline kita. Meskipun properti dan fungsi diperbolehkan, kami harus menyebutkan bahwa blok init , kelas dalam, dan bidang pendukung tidak diperbolehkan .

5. Warisan

Penting untuk disebutkan bahwa kelas inline hanya dapat mewarisi dari antarmuka , dan karena kita tidak dapat memiliki subkelas, kelas inline juga bersifat final secara efektif.

Diberikan sebuah antarmuka Drawable dengan metode draw () , kami akan mengimplementasikan metode ini di kelas CircleRadius kami :

interface Drawable { fun draw() } inline class CircleRadius(private val circleRadius : Double) : Drawable { val diameterOfCircle get() = 2 * circleRadius fun areaOfCircle() = 3.14 * circleRadius * circleRadius override fun draw() { println("Draw my circle") } }

6. Kesimpulan

Dalam artikel singkat ini, kami menjelajahi class inline di Kotlin. Selain itu, kami berbicara tentang pewarisan dan definisi properti dan fungsi.

Seperti biasa, semua contoh dan cuplikan ini dapat ditemukan di GitHub.