Kotlin bukan bahasa yang berubah secara kebetulan. Setiap fitur baru — data class, value class, data object, when guard, context parameter — melewati proses formal yang disebut Kotlin Evolution and Review Process (KEEP). Proses ini mengatur bagaimana proposal diajukan, didiskusikan, dan akhirnya dirilis atau ditolak. Pada chapter ini kita akan melihat tahapan KEEP, contoh proposal yang sudah dirilis, dan cara kita ikut berpartisipasi memberi masukan.

Apa itu KEEP #

KEEP adalah singkatan dari Kotlin Evolution and Enhancement Proposal. Setiap proposal disimpan di repositori GitHub https://github.com/Kotlin/KEEP dan mengikuti struktur dokumen yang konsisten:

  1. Judul dan ringkasan — masalah yang dipecahkan dan solusi yang diusulkan.
  2. Motivasi — mengapa fitur ini penting, contoh kode yang saat ini verbose.
  3. Spesifikasi teknis — sintaks baru, aturan inferensi tipe, perubahan bytecode.
  4. Backward compatibility — apakah kode lama tetap compile, apakah binary tetap kompatibel.
  5. Open questions — hal-hal yang belum diputuskan, biasanya di-resolve selama review.

Setiap proposal ditugaskan ke seorang champion dari Language Design Group (LDG) — komite kecil yang bertugas memutuskan arah bahasa. Anggota LDG termasuk Roman Elizarov (mantan project lead), Mikhail Zarechensky (compiler lead), dan beberapa engineer JetBrains lainnya.

Tahapan Proposal #

Tabel berikut merangkum tahapan sebuah KEEP dari ide hingga stabil:

TahapAktorOutput
1. Diskusi awalKomunitas (Slack, forum)Konsensus awal
2. KEEP draftPenyusun proposalDokumen di GitHub
3. ReviewLanguage Design GroupCatatan revisi
4. ImplementasiTim compilerFlag eksperimental (-XXLanguage:+Flag)
5. BetaPengguna early adopterFeedback bug
6. StabilSemua penggunaFitur default di versi mayor

Proses dari draft hingga stabil bisa memakan waktu satu hingga dua tahun. Misalnya, context receiver diusulkan di 2019 (KEEP-259), tapi baru distabilkan dalam bentuk yang berbeda (context parameter) di Kotlin 2.2 (2025).

Contoh Proposal yang Sudah Dirilis #

Beberapa fitur Kotlin yang kita pakai sehari-hari berasal dari KEEP:

kotlin
// kotlin_language_evolution.kt
// Mendemonstrasikan konsep Kotlin Evolution and Review Process (KEEP).
//
// KEEP = Kotlin Evolution and Enhancement Proposal.
// Dokumen ini menjelaskan proses bagaimana fitur bahasa Kotlin diusulkan,
// didiskusikan, dan akhirnya dirilis atau ditolak.
//
// Karena KEEP adalah proses sosial (di GitHub), kode di sini hanya mengilustrasikan
// bagaimana sebuah proposal KEEP memengaruhi kode kita.

// 1. Contoh proposal KEEP-324: Sealed class dengan multi-file (Kotlin 1.5)
//    Sebelum: sealed class harus di file yang sama
//    Sesudah: sealed class bisa lintas file di paket yang sama
sealed interface BentukGeometri {
    data class Lingkaran(val radius: Double) : BentukGeometri
    data class Persegi(val sisi: Double) : BentukGeometri
    data class Segitiga(val alas: Double, val tinggi: Double) : BentukGeometri
}

fun luas(b: BentukGeometri): Double = when (b) {
    is BentukGeometri.Lingkaran -> Math.PI * b.radius * b.radius
    is BentukGeometri.Persegi -> b.sisi * b.sisi
    is BentukGeometri.Segitiga -> 0.5 * b.alas * b.tinggi
}

// 2. Contoh proposal KEEP-110: Data class (sejak Kotlin 1.0)
//    Menghasilkan equals, hashCode, toString, copy, componentN otomatis
data class Pengguna(val nama: String, val umur: Int)

// 3. Contoh proposal KEEP-259: Inline class (kemudian value class, 1.5)
@JvmInline
value class Email(val nilai: String) {
    init {
        require(nilai.contains("@")) { "Email tidak valid: $nilai" }
    }
}

// 4. Contoh proposal KEEP-87: Elvis operator ?. dan ?: (sejak Kotlin awal)
fun namaDepan(lengkap: String?): String = lengkap?.substringBefore(" ") ?: "Tanpa Nama"

// 5. Contoh proposal KEEP-375: data object (Kotlin 1.9, stabil 2.0)
data object VersiBahasa {
    const val UTAMA = 2
    const val MINOR = 0
    const val PATCH = 21

    fun ringkas(): String = "$UTAMA.$MINOR.$PATCH"
}

fun main() {
    println("=== Kotlin Evolution and Review Process (KEEP) ===")
    println()

    println("--- 1. KEEP-324: Sealed class multi-file (1.5) ---")
    val bentuk: List<BentukGeometri> = listOf(
        BentukGeometri.Lingkaran(2.0),
        BentukGeometri.Persegi(3.0),
        BentukGeometri.Segitiga(4.0, 3.0)
    )
    bentuk.forEach { println("  $it -> luas ${luas(it)}") }

    println()
    println("--- 2. KEEP-110: data class (1.0) ---")
    val a = Pengguna("Budi", 25)
    val b = a.copy(umur = 26)
    println("a = $a")
    println("b = $b  (copy dari a, ubah umur)")
    println("a == b ? ${a == b}")

    println()
    println("--- 3. KEEP-259: value class (1.5, pengganti inline class) ---")
    val email1 = Email("[email protected]")
    val email2 = Email("[email protected]")
    println("email1 = $email1")
    println("email1 == email2 ? ${email1 == email2}  (berdasarkan nilai)")
    try {
        Email("bukan-email")
    } catch (e: IllegalArgumentException) {
        println("Validasi: ${e.message}")
    }

    println()
    println("--- 4. KEEP-87: elvis operator ---")
    println(namaDepan("Budi Setiawan"))
    println(namaDepan(null))

    println()
    println("--- 5. KEEP-375: data object (1.9, stabil 2.0) ---")
    println("Versi bahasa: ${VersiBahasa}")
    println("Ringkas: ${VersiBahasa.ringkas()}")

    println()
    println("--- 6. Tahapan proposal KEEP ---")
    val tahapan = listOf(
        "1. Diskusi awal di Kotlin Discussions / Slack",
        "2. KEEP draft di-submit ke GitHub.com/Kotlin/KEEP",
        "3. Review oleh Language Design Group (LDG)",
        "4. Implementation di compiler (beta, -XXLanguage:+Flag)",
        "5. Stabil di versi mayor berikutnya",
        "6. Deprecation bila diganti fitur baru"
    )
    tahapan.forEach { println("  $it") }

    println()
    println("--- 7. Komite bahasa ---")
    println("Kotlin Language Committee (LDG): Roman Elizarov,")
    println("Mikhail Zarechensky, dan lainnya. Bertemu 2 minggu sekali.")
}

Output yang Dihasilkan:

text
=== Kotlin Evolution and Review Process (KEEP) ===

--- 1. KEEP-324: Sealed class multi-file (1.5) ---
  Lingkaran(radius=2.0) -> luas 12.566370614359172
  Persegi(sisi=3.0) -> luas 9.0
  Segitiga(alas=4.0, tinggi=3.0) -> luas 6.0

--- 2. KEEP-110: data class (1.0) ---
a = Pengguna(nama=Budi, umur=25)
b = Pengguna(nama=Budi, umur=26)  (copy dari a, ubah umur)
a == b ? false

--- 3. KEEP-259: value class (1.5, pengganti inline class) ---
email1 = Email([email protected])
email1 == email2 ? true  (berdasarkan nilai)
Validasi: Email tidak valid: bukan-email

--- 4. KEEP-87: elvis operator ---
Budi
Tanpa Nama

--- 5. KEEP-375: data object (1.9, stabil 2.0) ---
Versi bahasa: VersiBahasa
Ringkas: 2.0.21

--- 6. Tahapan proposal KEEP ---
  1. Diskusi awal di Kotlin Discussions / Slack
  2. KEEP draft di-submit ke GitHub.com/Kotlin/KEEP
  3. Review oleh Language Design Group (LDG)
  4. Implementation di compiler (beta, -XXLanguage:+Flag)
  5. Stabil di versi mayor berikutnya
  6. Deprecation bila diganti fitur baru

--- 7. Komite bahasa ---
Kotlin Language Committee (LDG): Roman Elizarov,
Mikhail Zarechensky, dan lainnya. Bertemu 2 minggu sekali.

Pada cuplikan di atas, empat fitur yang kita anggap sepele sekarang berasal dari empat KEEP yang berbeda. Setiap fitur punya dokumen KEEP yang menjelaskan mengapa fitur itu ditambahkan, alternatif yang dipertimbangkan, dan trade-off yang diterima.

Cara Berpartisipasi #

Siapapun bisa mengajukan KEEP. Cara paling umum:

  1. Diskusi awal — mulai di https://discuss.kotlinlang.org/ atau Slack Kotlin. Dapatkan konsensus awal bahwa masalahnya nyata.
  2. Buat draft KEEP — fork https://github.com/Kotlin/KEEP, tambahkan proposal di format yang ditentukan, ajukan pull request.
  3. Tunggu review LDG — LDG bertemu 2 minggu sekali untuk membahas proposal baru. Bila proposal diterima, masuk ke tahap implementasi.
  4. Uji coba early access — saat compiler EAP dirilis, uji fitur dan laporkan bug.

Tidak semua KEEP diterima. Banyak proposal yang ditolak karena masalahnya bisa dipecahkan tanpa fitur baru, atau trade-off-nya lebih besar dari manfaatnya. Bila KEEP ditolak, dokumen tetap disimpan sebagai arsip agar diskusi tidak diulang.

Komite Bahasa #

Kotlin Language Committee (LDG) adalah komite kecil yang bertanggung jawab atas arah bahasa. Anggota tetap:

  • Roman Elizarov — Project Lead Kotlin hingga 2022, sekarang di AWS.
  • Mikhail Zarechensky — Compiler Lead, fokus pada K2.
  • Aleksandr Noskov, Denis Zharkov, dan lainnya — engineer JetBrains.

LDG bertemu dua minggu sekali untuk membahas proposal KEEP baru dan revisi proposal lama. Catatan rapat tidak selalu dipublikasikan, tetapi keputusan besar didokumentasikan di CHANGELOG Kotlin dan KEEP repository.

Referensi Lanjutan #

  • Kotlin documentation home — halaman utama dokumentasi Kotlin sebagai titik masuk evolusi bahasa dan KEEP proposals
  • JetBrains/kotlin on GitHub — repositori resmi JetBrains/kotlin yang memuat KEEP (Kotlin Evolution and Enhancement Process) dan riwayat perubahan bahasa

Selanjutnya #

Setelah memahami proses evolusi, kita lanjut ke topik praktis — compatibility dan migration — yang menjelaskan bagaimana kita memigrasikan kode dari versi lama ke versi baru dengan aman.