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.

kotlin Contoh: primary constructor ringkas
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:

JalurBentukKapan dipakai
Property initializerval x: T = ekspresiSaat property dapat dihitung langsung dari parameter constructor
init blockinit { ... }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.

kotlin
// 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:

text
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:

  1. class Peliharaan(val nama: String, val umur: Int): primary constructor menerima dua argumen. Karena keduanya memakai val, dua property read-only nama dan umur otomatis dibuat. Kompilator menyuntikkan constructor body yang menugaskan argumen ke field internal.
  2. val kategori: String = if (umur < 2) "Anak-anak" else "Dewasa": property initializer. Saat object dibuat, ekspresi di sisi kanan dievaluasi dengan nilai umur yang sudah ditugaskan. Hasilnya disimpan ke field kategori.
  3. init { println(...) }: init block dieksekusi setelah property initializer selesai. Saat dipanggil, semua property (nama, umur, kategori) sudah memiliki nilai, sehingga referensi di dalam println aman.
  4. Urutan eksekusi: saat Peliharaan("Miko", 1) dipanggil, kompilator mengalokasikan memori, menugaskan nama dan umur, lalu mengevaluasi kategori, lalu menjalankan init block. Inilah sebabnya pesan "Object Peliharaan dibuat" muncul sebelum pemanggilan deskripsi().
  5. miko.deskripsi(): pemanggilan method setelah object selesai dibuat. Property kategori sudah 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.

kotlin Contoh: parameter constructor tanpa val/var
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:

kotlin Contoh: primary constructor private
class Konfigurasi private constructor(val nama: String)

Pola ini umum dipakai pada class yang menerapkan pola singleton atau factory method.

Referensi Lanjutan #

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.