Primary constructor adalah constructor utama sebuah class yang dideklarasikan langsung pada header class. Berbeda dengan Java yang mengharuskan constructor ditulis sebagai method terpisah, Kotlin mengizinkan primary constructor ditulis ringkas dalam satu baris sebaris dengan deklarasi class. Pada chapter ini kita akan melihat sintaks primary constructor, dua cara menginisialisasi object (property initializer dan init block), serta kapan masing-masing cara dipakai.
Sintaks Primary Constructor #
Primary constructor ditulis dalam tanda kurung tepat setelah nama class. Parameter yang ditandai val atau var sekaligus mendeklarasikan property class. Parameter tanpa val/var hanya tersedia selama fase inisialisasi (dalam init block atau property initializer) dan tidak menjadi property permanen.
class Peliharaan(val nama: String, val umur: Int)Satu baris di atas setara dengan puluhan baris Java: deklarasi dua field, constructor dengan dua parameter, dan penugasan parameter ke field. Kotlin melakukan hal tersebut secara otomatis.
Dua Jalur Inisialisasi #
Setelah primary constructor menerima argumen, kita memiliki dua jalur untuk menyelesaikan inisialisasi object:
| Jalur | Bentuk | Kapan dipakai |
|---|---|---|
| Property initializer | val x: T = ekspresi | Saat property dapat dihitung langsung dari parameter constructor |
| init block | init { ... } | Saat inisialisasi memerlukan logika banyak baris atau efek samping |
Kedua jalur dapat dipakai bersamaan dalam satu class. Property initializer dievaluasi sesuai urutan deklarasi, demikian juga init block. Saat sebuah object dibuat, semua property initializer dan init block dieksekusi berurutan dari atas ke bawah.
Contoh Lengkap Primary Constructor #
Contoh berikut mendefinisikan class Peliharaan dengan primary constructor dua parameter. Property kategori dihitung dari parameter umur menggunakan property initializer. Init block mencatat pembuatan object ke stdout untuk memperjelas urutan eksekusi.
// peliharaan.kt
// Mendemonstrasikan primary constructor dengan property initializer dan init block.
class Peliharaan(val nama: String, val umur: Int) {
val kategori: String = if (umur < 2) "Anak-anak" else "Dewasa"
init {
println("Object Peliharaan dibuat: $nama, umur $umur, kategori $kategori")
}
fun deskripsi(): String {
return "$nama ($kategori), umur $umur tahun."
}
}
fun main() {
val miko = Peliharaan("Miko", 1)
val rex = Peliharaan("Rex", 4)
println(miko.deskripsi())
println(rex.deskripsi())
}Output yang Dihasilkan:
Object Peliharaan dibuat: Miko, umur 1, kategori Anak-anak
Object Peliharaan dibuat: Rex, umur 4, kategori Dewasa
Miko (Anak-anak), umur 1 tahun.
Rex (Dewasa), umur 4 tahun.Mari kita amati alur eksekusinya:
class Peliharaan(val nama: String, val umur: Int): primary constructor menerima dua argumen. Karena keduanya memakaival, dua property read-onlynamadanumurotomatis dibuat. Kompilator menyuntikkan constructor body yang menugaskan argumen ke field internal.val kategori: String = if (umur < 2) "Anak-anak" else "Dewasa": property initializer. Saat object dibuat, ekspresi di sisi kanan dievaluasi dengan nilaiumuryang sudah ditugaskan. Hasilnya disimpan ke fieldkategori.init { println(...) }: init block dieksekusi setelah property initializer selesai. Saat dipanggil, semua property (nama,umur,kategori) sudah memiliki nilai, sehingga referensi di dalamprintlnaman.- Urutan eksekusi: saat
Peliharaan("Miko", 1)dipanggil, kompilator mengalokasikan memori, menugaskannamadanumur, lalu mengevaluasikategori, lalu menjalankan init block. Inilah sebabnya pesan"Object Peliharaan dibuat"muncul sebelum pemanggilandeskripsi(). miko.deskripsi(): pemanggilan method setelah object selesai dibuat. Propertykategorisudah final dan dapat dibaca berkali-kali tanpa re-evaluasi.
Primary Constructor Tanpa val/var #
Bila sebuah parameter constructor tidak memakai val/var, parameter tersebut hanya dapat dipakai selama inisialisasi dan tidak menjadi property publik. Pola ini berguna saat sebuah argumen hanya dipakai untuk menghitung property lain dan tidak perlu disimpan apa adanya.
class Lingkaran(jariJari: Double) {
val luas: Double = 3.14 * jariJari * jariJari
}Pada contoh di atas, jariJari hanya dipakai untuk menghitung luas. Setelah inisialisasi selesai, jariJari tidak dapat diakses dari luar class. Hanya property luas yang tersedia.
Visibility pada Primary Constructor #
Primary constructor bersifat public secara default. Bila ingin membatasi — misalnya mendorong pemanggil menggunakan secondary constructor atau factory function — kita dapat menandai constructor dengan modifier visibility dan menempatkan keyword constructor secara eksplisit:
class Konfigurasi private constructor(val nama: String)Pola ini umum dipakai pada class yang menerapkan pola singleton atau factory method.
Referensi Lanjutan #
- Classes and Inheritance — bagian primary constructor pada panduan class Kotlin
Ringkasan #
Primary constructor adalah cara idiomatik Kotlin untuk mendeklarasikan class dengan data inisial. Parameter val/var langsung menjadi property. Inisialisasi tambahan dapat dilakukan melalui property initializer (untuk nilai yang dihitung dari parameter) atau init block (untuk logika banyak baris). Pada chapter Secondary Constructors berikutnya, kita akan melihat bagaimana sebuah class dapat memiliki beberapa constructor alternatif yang semuanya bermuara pada primary constructor.