Kotlin Language Specification (spec) di kotlinlang.org/spec/ adalah dokumen formal yang menjelaskan perilaku bahasa Kotlin secara presisi. Berbeda dari dokumentasi tutorial yang berorientasi contoh, spec menulis aturan dalam bentuk definisi formal — kadang disertai BNF grammar — sehingga tidak ada ruang tafsir. Pada chapter ini kita memetakan bagian utama spec dan mendemokan beberapa perilaku yang diaturnya: smart cast, operator overloading, overload resolution, default argument, dan nullability.
Bagian Utama Spec #
Spec disusun dalam delapan bagian besar. Setiap bagian menjawab kategori pertanyaan berbeda. Berikut peta singkatnya:
| Bagian | Membahas | Pertanyaan yang dijawab |
|---|---|---|
| 1. Introduction | Tujuan dan struktur spec | Untuk siapa spec ditulis |
| 2. Lexical grammar | Token, identifier, literal | Apa yang dianggap token valid |
| 3. Type system | Tipe data, nullability, generic | Bagaimana tipe dirakit |
| 4. Expressions | Operator, lambda, when, try | Bagaimana ekspresi dievaluasi |
| 5. Declarations | Class, function, property, import | Apa yang boleh dideklarasikan |
| 6. Statements | Assignment, control flow | Bagaimana statement bekerja |
| 7. Resolution | Overload, smart cast, type inference | Bagaimana kompilator memilih |
| 8. Patterns | Destructuring, builder | Pola komposisi yang didukung |
Smart Cast dan Overload Resolution #
Bagian paling sering dirujuk dari spec adalah bagian 7 (Resolution). Smart cast diatur di sub-bagian 11.1.1, dan overload resolution di bagian 11. Ketika kita menulis if (x is String) x.uppercase(), spec menjelaskan persis kondisi di mana x dianggap String di dalam branch then. Ketika kita memanggil panggil(42) dengan beberapa overload, spec menjelaskan aturan prioritas: tipe yang lebih spesifik menang.
Cuplikan berikut mendemokan smart cast, operator overloading, overload resolution, default argument, dan nullability sekaligus:
// kotlin_language_specification.kt
// Demonstrasi beberapa perilaku yang diatur oleh Kotlin Language Specification
// (https://kotlinlang.org/spec/).
// Spec menjelaskan aturan resolusi overloading, smart cast, dan inferensi tipe
// secara formal.
// 1. Smart cast — spec menjelaskan kapan smart cast berlaku
fun smartCastDemo(x: Any): String {
if (x is String) {
// Smart cast otomatis ke String; spec bagian 11.1.1
return x.uppercase()
}
return "bukan string"
}
// 2. Operator overloading — spec bagian 13 (Operator functions)
data class Vektor(val x: Int, val y: Int) {
operator fun plus(other: Vektor) = Vektor(x + other.x, y + other.y)
operator fun times(skalor: Int) = Vektor(x * skalor, y * skalor)
}
// 3. Resolution ambiguity — spec bagian 11 (Overload resolution)
class Layanan {
fun panggil(x: Int) = "int"
fun panggil(x: String) = "string"
fun panggil(x: Any) = "any"
}
// 4. Default argument — spec bagian 8.5.1 (Default values)
fun buatNama(depan: String = "Tanpa", belakang: String = "Nama") =
"$depan $belakang"
// 5. Elaborasi tipe nullable — spec bagian 7.1 (Nullability)
fun panjangNullable(s: String?): Int = s?.length ?: 0
fun main() {
println("=== Kotlin Language Specification ===")
println("Sumber resmi: https://kotlinlang.org/spec/")
println()
println("--- 1. Smart cast (spec 11.1.1) ---")
println("smartCastDemo(\"halo\") -> ${smartCastDemo("halo")}")
println("smartCastDemo(42) -> ${smartCastDemo(42)}")
println()
println("--- 2. Operator overloading (spec 13) ---")
val a = Vektor(1, 2)
val b = Vektor(3, 4)
println("a + b = ${a + b}")
println("a * 5 = ${a * 5}")
println()
println("--- 3. Overload resolution (spec 11) ---")
val l = Layanan()
println("panggil(42) -> ${l.panggil(42)}") // int (paling spesifik)
println("panggil(\"halo\") -> ${l.panggil("halo")}") // string (paling spesifik)
println("panggil(true) -> ${l.panggil(true)}") // any (fallback)
println()
println("--- 4. Default argument (spec 8.5.1) ---")
println("buatNama() -> ${buatNama()}")
println("buatNama(\"Budi\") -> ${buatNama("Budi")}")
println("buatNama(\"Siti\", \"Dewi\") -> ${buatNama("Siti", "Dewi")}")
println("buatNama(belakang=\"X\") -> ${buatNama(belakang = "X")}")
println()
println("--- 5. Nullability (spec 7.1) ---")
println("panjangNullable(\"halo\") -> ${panjangNullable("halo")}")
println("panjangNullable(null) -> ${panjangNullable(null)}")
println()
println("--- 6. Bagian utama spec ---")
val bagian = listOf(
"1. Introduction — tujuan dan struktur spec",
"2. Lexical grammar — token, identifier, literal",
"3. Type system — tipe data, nullability, generic",
"4. Expressions — operator, lambda, when, try",
"5. Declarations — class, function, property, import",
"6. Statements — assignment, control flow",
"7. Resolution — overload, smart cast, type inference",
"8. Patterns — destructuring, builder"
)
bagian.forEach { println(" $it") }
println()
println("--- 7. Cara membaca spec ---")
println(" Spec ditulis dalam Markdown berisi aturan formal (kadang BNF)")
println(" Tidak semua section relevan untuk sehari-hari; fokus ke bagian")
println(" yang menjelaskan perilaku membingungkan (smart cast, overload)")
}Output yang Dihasilkan:
=== Kotlin Language Specification ===
Sumber resmi: https://kotlinlang.org/spec/
--- 1. Smart cast (spec 11.1.1) ---
smartCastDemo("halo") -> HALO
smartCastDemo(42) -> bukan string
--- 2. Operator overloading (spec 13) ---
a + b = Vektor(x=4, y=6)
a * 5 = Vektor(x=5, y=10)
--- 3. Overload resolution (spec 11) ---
panggil(42) -> int
panggil("halo") -> string
panggil(true) -> any
--- 4. Default argument (spec 8.5.1) ---
buatNama() -> Tanpa Nama
buatNama("Budi") -> Budi Nama
buatNama("Siti", "Dewi") -> Siti Dewi
buatNama(belakang="X") -> Tanpa X
--- 5. Nullability (spec 7.1) ---
panjangNullable("halo") -> 4
panjangNullable(null) -> 0
--- 6. Bagian utama spec ---
1. Introduction — tujuan dan struktur spec
2. Lexical grammar — token, identifier, literal
3. Type system — tipe data, nullability, generic
4. Expressions — operator, lambda, when, try
5. Declarations — class, function, property, import
6. Statements — assignment, control flow
7. Resolution — overload, smart cast, type inference
8. Patterns — destructuring, builder
--- 7. Cara membaca spec ---
Spec ditulis dalam Markdown berisi aturan formal (kadang BNF)
Tidak semua section relevan untuk sehari-hari; fokus ke bagian
yang menjelaskan perilaku membingungkan (smart cast, overload)Perhatikan tiga kelompok utama yang dicetak: smart cast mengubah Any menjadi String setelah is-check, operator overloading menghasilkan Vektor baru, dan overload resolution memilih overload paling spesifik (panggil(42) mengembalikan "int", bukan "any"). Empat kelompok sisanya mencetak ringkasan struktur spec dan tips membaca.
Cara Membaca Spec #
Spec ditulis dalam Markdown dengan banyak definisi formal. Tidak semua bagian relevan untuk pekerjaan sehari-hari; fokuskan ke bagian yang menjelaskan perilaku yang membingungkan: smart cast (11.1.1), overload resolution (11), dan nullability (7.1). Bila kita bertemu perilaku tak terduga di kompilator, cari di spec dulu sebelum mengarang teori sendiri.
Referensi Lanjutan #
- Kotlin language specification — spesifikasi bahasa Kotlin yang merinci sintaks, semantik, dan aturan tipe secara formal
Selanjutnya #
Setelah memahami aturan formal bahasa, langkah berikutnya adalah memahami standard library Kotlin. Chapter berikutnya membahas Kotlin API reference — peta function, package, dan cara navigasinya.