Kelas adalah cetak biru untuk membentuk objek, sedangkan instans (instance) adalah objek nyata yang dihasilkan dari kelas tersebut. Topik ini membahas deklarasi kelas, constructor utama (primary constructor), blok init, dan constructor sekunder (secondary constructor), beserta cara membuat instans tanpa kata kunci new. Setiap contoh dikompilasi dan dijalankan di terminal, lalu keluarannya ditampilkan sebagaimana adanya.
Deklarasi kelas dan instansiasi#
Deklarasi kelas paling sederhana terdiri atas kata kunci class diikuti nama kelas, dan instans dibuat dengan memanggil nama kelas itu seperti pemanggilan fungsi. Tanda kurung pada pemanggilan tersebut merujuk pada constructor, yaitu blok kode yang dijalankan ketika instans dibentuk. Berbeda dengan Java, Kotlin tidak mengenal kata kunci new, sehingga pembuatan instans ditulis KartuUjian() dan bukan new KartuUjian(). Nama kelas mengikuti pola PascalCase, dan satu berkas boleh memuat lebih dari satu kelas.
Setiap instans membawa keadaan sendiri, sehingga mengubah satu instans tidak pernah memengaruhi instans lain yang dibentuk dari kelas yang sama. Nilai terisi pada ruangA dan ruangB berjalan terpisah meskipun keduanya bertipe RuangUjian. Keterpisahan inilah yang membedakan kelas dari kumpulan fungsi biasa, karena data dan perilakunya hidup bersama di dalam instans.
Buat berkas main.kt berikut, lalu jalankan dengan dua perintah di bawahnya.
class KartuUjian(val nomor: Int, val nama: String) {
init {
println("Kartu $nomor atas nama $nama siap dipakai")
}
}
class RuangUjian(val kode: String) {
var terisi = 0
constructor(kode: String, kapasitas: Int) : this(kode) {
terisi = kapasitas
}
}
fun main() {
val kartuA = KartuUjian(1, "Ali")
val kartuB = KartuUjian(2, "Citra")
val ruangA = RuangUjian("R-101")
val ruangB = RuangUjian("R-102", 24)
println("${ruangA.kode} terisi ${ruangA.terisi}")
println("${ruangB.kode} terisi ${ruangB.terisi}")
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi berkas main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKtKartu 1 atas nama Ali siap dipakai
Kartu 2 atas nama Citra siap dipakai
R-101 terisi 0
R-102 terisi 24Program di atas membentuk dua instans KartuUjian dan dua instans RuangUjian. Dua baris pertama keluaran berasal dari blok init milik KartuUjian, yang tercetak begitu instansnya dibentuk, jauh sebelum pernyataan println di dalam main dijalankan. Dua baris terakhir memperlihatkan akses properti melalui tanda titik, yaitu ruangA.kode dan ruangA.terisi. Kedua instans RuangUjian dibentuk lewat jalur yang berbeda, dan perbedaan itu dijelaskan pada bagian constructor sekunder.
Constructor utama#
Constructor utama ditulis sejajar dengan nama kelas di dalam tanda kurung, sebagaimana (val nomor: Int, val nama: String) pada KartuUjian. Parameter yang diberi val atau var otomatis menjadi properti kelas, sehingga nomor dan nama dapat dibaca dari luar kelas tanpa deklarasi tambahan. Inilah cara paling ringkas untuk menyatakan data yang wajib dimiliki setiap instans, karena deklarasi properti, parameternya, dan pengisiannya terjadi dalam satu penulisan.
Parameter tanpa val maupun var hanyalah parameter biasa yang hidup selama proses inisialisasi, dan tidak menjadi properti. Nilainya boleh dipakai oleh inisialisator properti dan blok init, tetapi tidak boleh dipanggil dari fungsi kelas lainnya. Isi constructor utama juga sengaja dibuat ringkas karena Kotlin tidak menyediakan tempat pernyataan di sana, sehingga pekerjaan inisialisasi ditempatkan pada inisialisator properti seperti var terisi = 0 dan pada blok init.
Blok init#
Blok init berisi pernyataan yang dijalankan pada setiap pembentukan instans, tepat setelah properti-properti kelas terisi. Blok ini tidak menerima argumen dan tidak dapat dipanggil secara manual, sehingga satu-satunya pemicunya adalah pembentukan instans. Pada KartuUjian, blok init mencetak pesan yang menggabungkan nilai nomor dan nama, sehingga pesan itu muncul dua kali karena dua instans dibentuk. Blok ini cocok untuk validasi argumen, pencatatan, atau penyiapan sumber daya yang harus dilakukan sebelum instans dipakai.
Urutan eksekusi ini penting ketika blok init membaca properti yang nilainya baru diisi kemudian. Properti yang dibaca sebelum diinisialisasi akan berisi nilai bawaan tipe numerik atau null, dan compiler tidak selalu mencegah pola semacam itu. Menempatkan inisialisator properti sebelum blok init yang memakainya adalah kebiasaan yang menjaga urutan tetap mudah diikuti.
Constructor sekunder#
Constructor sekunder dideklarasikan dengan kata kunci constructor di dalam tubuh kelas, sebagaimana pada RuangUjian. Kelas tersebut menyediakan dua jalur pembentukan, yaitu RuangUjian("R-101") lewat constructor utama dan RuangUjian("R-102", 24) lewat constructor sekunder. Constructor sekunder wajib mendelegasikan ke constructor utama melalui this(kode), sehingga pengisian properti kode tetap terjadi di satu tempat. Pernyataan setelah delegasi baru dijalankan setelah seluruh bagian constructor utama selesai, dan itulah yang mengisi terisi dengan 24.
Kesalahan umum#
Kesalahan yang sering muncul adalah memakai parameter constructor utama yang tidak diberi val di dalam fungsi kelas. Berkas berikut sengaja memuat kesalahan tersebut.
class Pendaftaran(nomor: Int) {
fun tampilkan(): Int {
return nomor
}
}# kompilasi berkas salahparam.kt untuk melihat pesan error dari compiler
kotlinc salahparam.kt -d salah.jarsalahparam.kt:3:16: error: unresolved reference 'nomor'.
return nomor
^^^^^Pesan unresolved reference muncul karena nomor tidak menjadi properti, sehingga tidak dikenali dari dalam tampilkan. Perbaikannya ada dua, yaitu menambahkan val pada parameter agar nomor tersimpan sebagai properti, atau menyalin nilai parameter ke sebuah properti pada saat inisialisasi. Pilihan pertama dipakai ketika nilai memang perlu dibaca sepanjang hidup instans, sedangkan pilihan kedua dipakai ketika nilai hanya diperlukan untuk menurunkan properti lain.
Kesalahan lain yang lazim adalah menulis kata kunci new karena kebiasaan dari Java. Compiler menolaknya sebagai syntax error, dan perbaikannya sederhana, yaitu menghapus new sehingga pemanggilan kembali menjadi bentuk pemanggilan fungsi biasa.
Ringkasan#
- Instans dibuat dengan memanggil nama kelas seperti pemanggilan fungsi, tanpa kata kunci
new. - Parameter constructor utama yang diberi
valatauvarmenjadi properti kelas, sedangkan parameter tanpa keduanya hanya hidup selama inisialisasi. - Blok
initdijalankan pada setiap pembentukan instans, berurutan dengan inisialisator properti sesuai posisi deklarasinya. - Constructor sekunder mendelegasikan ke constructor utama melalui
this(...)sebelum pernyataannya sendiri dijalankan.
Referensi#
- Classes — Kotlin Documentation — Dokumentasi resmi deklarasi kelas, constructor utama dan sekunder, serta blok inisialisasi.