7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Kotlin

Kotlin From Scratch: Properti Lanjutan and Kelas

Scroll to top
Read Time: 12 mins
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Classes and Objects
Kotlin From Scratch: Abstract Classes, Interfaces, Inheritance, and Type Alias

Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)

Kotlin adalah bahasa pemrograman modern yang mengkompilasi ke Java bytecode. Bahasa pemrograman ini gratis dan open source, dan menjanjikan untuk membuat coding untuk Android semakin menyenangkan. 

Pada artikel sebelumnya, Anda belajar tentang kelas dan objek di Kotlin. Dalam tutorial ini, kita akan terus belajar lebih banyak tentang properti dan juga melihat jenis kelas lanjutan di Kotlin dengan mengeksplorasi hal berikut:

  • Late-Initialized Properti
  • Inline Properti 
  • extension properti
  • data, enum, nested, dan sealed class

1. ILate-Initialized Properti

Kita bisa mendeklarasikan properti non-null di Kotlin sebagai late-initialized. Ini berarti bahwa properti non-null tidak akan diinisialisasi pada waktu deklarasi dengan inisialisasi nilai sebenarnya tidak akan terjadi melalui konstruktor apapun namun sebaliknya, akan diinisialisasi di akhir dengan metode atau injeksi dependensi.

Mari kita lihat sebuah contoh untuk memahami pengubah properti unik ini.

Dalam kode di atas, kami mendeklarasikan properti Repository nihil yang dapat berubah-ubah yang merupakan jenis Repository - di dalam class Presenter - dan kami kemudian menginisialisasi properti ini menjadi nol selama deklarasi. kita memiliki fungsi initRepository() di dalam kelas Presenter yang menginisiasi ulang properti ini nanti dengan aktual instance Repository. Perlu diingat bahwa properti ini juga bisa diisi nilai menggunakan injektor dependensi seperti pisau.

Sekarang, kita panggil fungsi atau sifat dalam hal ini properti repository, kita harus melakukan pengecekan null atau menggunakan safe call operatoro. Mengapa?  Karena properti repository merupakan nullable bertipe (Repository?). (Jika Anda butuh penjelasan tentang nullability pada Kotlin, silahkan kunjungi Nullability, Loops, and Conditions).

Untuk menghindari melakukan null check setiap waktu kita perlu untuk memanggil fungsi dari properti, kita bisa menandai properti tersebut dengan modifier lateinit — Ini berarti kita telah mendeklarasikan properti tersebut (yang mana merupakan instance dari kelas lain) sebagai late-initialized (artinya property akan diinisialisasikan nanti).

Sekarang, selama kita menunggu sampai properti telah diberi nilai, kita dapat mengakses fungsi dari properti tanpa melakukan null check. Inisialisasi properti bisa terjadi baik dalam metode setter atau melalui injeksi dependensi. 

Perlu dicatat bahwa jika kita ingin mencoba mengakses method dari properti sebelum itu terinisialisasi, kita akan mendapat pesan kotlin.UninitializedPropertyAccessException bukannya NullPointerException. Dalam hal ini, pesan akan menjadi "lateinit property repository has not been initialized". 

Perhatikan juga pembatasan berikut ditempatkan saat menunda inisialisasi properti dengan lateinit:

  • Ini dapat berubah (deklarasi dengan var).
  • Tipe properti tidak bisa menjadi tipe primitif —contoh, IntDoubleFloat, dan lainnya.
  • Properti tidak bisa punya getter atau setter kustom.

2. Inline Properties

Dalam Fungsi Lanjutan, Saya menjelaskan tentang modifier inline untuk fungsi high-order — ini membantu mengoptimasi fungsi high-order yang menerima lambda sebagai parameter.

Di Kotlin, kita juga dapat menggunakan modifier inline pada properti. Menggunakan modifier ini akan mengoptimalkan akses ke properti.

Mari lihat contohnya

Pada kode di atas, kita punya sebuah properti normal, nickName, yang tidak memiliki modifier inline. Jika kita mendekompilasi snippet kode, menggunakan fitur Show Kotlin Bytecode (jika di IntelliJ IDEA or Android Studio, menggunakan Tools > Kotlin > Show Kotlin Bytecode), kita akan melihat java code berikut:

Dalam kode Java yang dihasilkan di atas (beberapa elemen kode yang dihasilkan dihapus karena singkatnya maksudnya), Anda dapat melihatnya di dalam metode main() compiler membuat sebuah objek Student, memanggil method getNickName(), dan selanjutnya menampilkan nilai.

Sekarang tentukan properti sebagai inline Sebagai gantinya, dan bandingkan bytecode yang dihasilkan.

Kita tinggal memasukkan modifier inline sebelum variabel modifier: var or val. Berikut ini bytecode yang telah dihasilkan pada inline property:

Lagi-lagi, beberapa kode terhapus, tetapi hal penting yang perlu dicatat adalah method main(). Compiler telah menyalin isi fungsi properti get() dan menaruhnya ke dalam call site (mekanisme ini mirip dengan inline functions).

Kode kita telah dioptimalkan karena tidak perlu membuat objek dan memanggil metode pengambil properti. Tapi, seperti yang dibahas di posting fungsi inline, kita akan memiliki bytecode lebih besar dari sebelumnya - jadi gunakan dengan hati-hati.

Perhatikan juga bahwa mekanisme ini akan bekerja untuk properti yang tidak memiliki backing field (ingat, backing field hanya bidang yang digunakan oleh properti saat Anda ingin memodifikasi atau menggunakan data bidang itu).

3. Extension Properties

Pada Advanced Functions Saya juga membahas extension functions yang memberi kita kemampuan untuk mengextend sebuah kelas dengan fungsi baru tanpa mewariskan sifat dari kelas tersebut. Kotlin juga menyediakan mekanisme serupa untuk properti, yang disebut extension properties.

Pada Advanced Functions post Kita mendefinisikan sebuah extension function uppercaseFirstLetter() dengan tipe receiver String. Disini, kita mengkonversi itu ke dalam top-level extension property. perhatikan bahwa Anda harus mendefinisikan sebuah getter method pada properti agar berhasil.

Jadi dengan pengetahuan baru tentang properti ekstensi ini, Anda akan tahu bahwa jika Anda menginginkan kelas harus memiliki properti yang tidak tersedia, Anda bebas untuk membuat properti ekstensi dari kelas itu.

4. Data Classes

Mari kita mulai dengan kelas Java yang khas atau POJO (Plain Old Java Object).

Seperti yang terlihat, kita perlu membuat kode pada kelas properti secara eksplisit: getter dan setter seperti hashcodeequals, dan toString methods (meskipun IntelliJ IDEA, Android Studio, atau library AutoValue dapat membantu kita menghasilkan itu). Kita bisa lihat kebanyakan kode pada di lapisan data dari proyek Java yang khas (Saya menghilangkan field accessors dan constuctorI removed the field accessors and constructor untuk mempersingkat).

Hal bagus yaitu tim Kotlin menyediakan kita dengan modifier data untuk kelas untuk mengeliminasi penulisan boilerplate.

Mari sekarang tuliskan kode sebelumnya di Kotlin.

Menakjubkan! Kita baru saja menentukan modifier data sebelum kata kunci class untuk membuat sebuat kelas data seperti apa yang kita telah lakukan pada class diatas BlogPost.  Sekarang equalshashcodetoStringcopy, dan beberapa metode komponen akan dibuat untuk kita. Perhatikan bahwa data kelas dapat memperpanjang kelas lainnya (ini adalah fitur baru Kotlin 1.1).

Metode equals

Metode ini membandingkan dua objek untuk persamaan, dan mengembalikan nilai true jika sama atau salah. Dengan kata lain, membandingkan jika dua instance kelas berisi data yang sama.

Di Kotlin, menggunakan operator persamaan == akan memanggil methode quals.

Metode hashCode

Metode ini mengembalikan nilai integer yang digunakan untuk penyimpanan cepat dan pengambilan data yang tersimpan dalam struktur data koleksi berbasis hash, misalnya di HashMap dan collection types HashSet.

Metode toString

Metode ini menghasilkan representasi String dari sebuah objek.

Dengan hanya memanggil instance kelas, kita mendapatkan sebuah objek string kembali kepada kita-Kotlin memanggil objek itu toString() untuk kita. Tapi jika kita tidak meletakkan kata kunci data, lihat apa representasi string objek kita:

Jauh Lebih Informatif!

Method copy

Metode ini memungkinkan kita membuat instance baru dari sebuah objek dengan semua nilai properti yang sama. Dengan kata lain, itu menciptakan salinan objek.

Hal bagus tentang method copy pada Kotlin adalah kemampuan untuk mengubah properti selama penyalinan.

Jika Kamu Java coder, method ini mirip dengan method clone() yang telah kamu ketahui. Tapi metode copy Kotlin mempunyai banyak fitur unggulan.

Destructive Declaration

Pada class Person, kita juga telah mempunyai dua auto-generated method oleh compiler karena keyword data ditempatkan pada kelas. Dua method itu merupakan These two methods diawali dengan "komponen", kemudian diikuti oleh sejumlah sufiks: component1()component2().  Masing-masing metode ini mewakili sifat individu dari jenis ini. Perhatikan bahwa akhiran sesuai dengan urutan properti yang dinyatakan dalam konstruktor utama.

Jadi, di contoh kita panggil component1() akan menampilkan first name, dan memanggil component2() akan menampilkan last name.

Memanggil properti menggunakan gaya ini sulit dimengerti dan dibaca, karena begitu memanggil nama properti secara eksplisit jauh lebih baik. Namun, properti yang dibuat secara implisit ini memiliki tujuan yang sangat berguna: mereka membiarkan kita melakukan deklarasi destrukturisasi, di mana kita dapat menetapkan setiap komponen ke variabel lokal.

Apa yang telah kita lakukan di sini adalah langsung menetapkan properti pertama dan kedua (firstName dan lastName) dari Person tipe variabel firstName dan lastName masing2. Saya juga membahas mekanisme ini yang dikenal dengan destructuring declaration di bagian terakhir Packages and Basic Functions post. 

5. Nested Classes

Pada More Fun With Functions post, Saya katakan bahwa Kotlin memiliki dukungan untuk fungsi lokal atau nested — fungsi yang dinyatakan di dalam fungsi lain. Nah, Kotlin juga mendukung kelas bersarang — kelas yang dibuat di kelas lain.

Kami bahkan memanggil fungsi publik kelas nested seperti yang terlihat di bawah ini-kelas bersarang di Kotlin setara dengan sebua static kelas bersarang di Java. Perhatikan bahwa kelas bersarang tidak dapat menyimpan referensi ke kelas luarnya.

We're also free to set the nested class as private — this means we can only create an instance of the NestedClass within the scope of the OuterClass.

Inner Class

Inner classes, Di sisi lain, bisa merujuk Outter Classes yang dideklarasikannya. Untuk membuat Inner Class, kita tempatkan keywordinner sebelum keyword class pada nested class.

Disini kita mereferensi OuterClass dari InnerClass menggunakan this@OuterClass.

6. Enum Classes

Jenis enum menyatakan satu set konstanta yang ditunjukkan oleh pengenal. Kelas khusus ini dibuat oleh kata kunci enum yang ditentukan sebelum kata kunci class.

Untuk mengambil nilai enum berdasarkan namanya (seperti di Java), kita dapat melakukan ini:

atau kita bisa menggunakan helper method Kotlin enumValueOf<T>() untuk mengakses constants melalui cara biasa:

Juga, kita bisa mendapatkan semua nilai (seperti untuk Java enum) seperti ini:

Akhirnya, kita bisa menggunakan helper method Kotlin enumValueOf<T>() untuk mendapatkan semua entri enum secara generik:

Ini mengembalikan sebuah array yang berisi entri enum.

Enum Constructors

Sama seperti kelas normal, tipe enum dapat memiliki konstruktor sendiri dengan sifat yang terkait dengan setiap konstanta enum.

Pada enum tipe primary constructor Country, kita mendefinisikan properti yang tidak berubah callingCodes untuk setiap konstanta enum. Dalam masing-masing konstanta, kami melewati sebuah argumen ke konstruktor.

Kita kemudian bisa mengakses properti konstanta seperti ini:

7. Sealed Classes

Sealed Class di Kotlin adalah kelas abstrak (Anda tidak pernah bermaksud membuat objek darinya) yang dapat diperluas kelas lain. Subclass ini didefinisikan di dalam tubuh kelas yang disegel — dalam file yang sama.  Karena semua subclass ini didefinisikan di dalam tubuh kelas yang disegel, kita dapat mengetahui semua subclass yang mungkin dengan hanya melihat file.

Lihat contoh berikut.

Untuk mendeklarasikan sebuah class sebagai sealed, kita masukkan modifier sealed sebelum modifier class di header deklarasi kelas — dalam kasus kita, kita menyatakan class Shape sebagai sealed. Sealed class tidak lengkap tanpa subkelasnya — sama seperti kelas abstrak yang khas — jadi kita harus mendeklarasikan subclass individual di dalam file yang sama (shape.kt pada kasus ini). Perhatikan bahwa Anda tidak dapat menentukan subkelas dari kelas yang disegel dari file lain.

Dalam kode di atas, kami telah menentukan bahwa kelas Shape hanya bisa diperpanjang oleh kelas CircleTriangle, dan Rectangle.

Sealed classes pada Kotlin memiliki aturan tambahan:

  • Kita bisa menambahkan modifier abstract ke sealed class, tapi ini berlebihan karena kelas tertutup abstrak secara default.
  • Sealed classes tidak bisa punya modifier open atau final.
  • kita juga bebas untuk mendeklarasikan kelas data dan objek sebagai subclass ke kelas yang disegel (mereka masih perlu dideklarasikan di file yang sama).
  • Kelas yang tertutup tidak diizinkan untuk memiliki konstruktor publik — konstruktor mereka bersifat pribadi secara default.

Kelas yang memperpanjang subclass dari kelas yang disegel dapat ditempatkan baik dalam file yang sama atau file lain. Subclass kelas yang disegel harus ditandai dengan modifier open (Anda akan belajar lebih banyak tentang warisan di Kotlin di posting berikutnya).

Kelas yang disegel dan subclassnya sangat berguna dalam ekspresi when. contoh:

Disini compiler pintar memastikan kita menutup semua kemungkinan kasus when. Itu berarti tidak perlu menambahkan kata else.

Jika kita melakukan hal berikut sebagai gantinya:

Kode tidak akan dikompilasi, karena kita belum memasukkan semua kemungkinan kasus. kita dapat pesan kesalahan berikut:

Jadi kita bisa memasukkan case is Rectangle atau kata else untuk menyempurnakan ekspresi when.

Kesimpulan

Dalam tutorial ini, Anda belajar lebih banyak tentang kelas di Kotlin. kita membahas hal berikut tentang properti kelas:

  • late initialization
  • inline properties
  • extension properties

Juga, Anda belajar tentang beberapa kelas yang keren dan canggih seperti data, enum, nested, dan kelas tertutup. Pada tutorial berikutnya di Kotlin From Scratch, Anda akan diperkenalkan ke antarmuka dan pewarisan di Kotlin. Sampai jumpa lagi!

Untuk mempelajari lebih lanjut tentang bahasa Kotlin, saya sarankan untuk mengunjungi Kotlin documentation. Atau lihat beberapa posting pengembangan aplikasi Android kami yang lain di sini tentang Envato Tuts!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.