Bahasa pemrograman menetapkan aturan sintaks — kata apa yang boleh dipakai sebagai nama. Namun di atas aturan sintaks, terdapat konvensi yang membantu kode dapat dibaca konsisten oleh banyak developer. Pada chapter ini kita akan membedah konvensi penamaan resmi Kotlin: camelCase untuk variabel dan function, PascalCase untuk class, UPPER_SNAKE_CASE untuk konstanta, serta lowercase untuk package. Kita juga akan melihat kapan konvensi ini boleh dilanggar dengan alasan kuat.

Empat Konvensi Utama #

Kotlin Coding Conventions mengelompokkan penamaan ke dalam empat aturan utama:

KonteksKonvensiContoh
Variabel, property, functioncamelCasenamaPengguna, hitungTotal()
Class, interface, object, enumPascalCaseclass Pengguna, interface DapatDiskon
Konstanta compile-timeUPPER_SNAKE_CASEconst val MAX_PESERTA = 50
Packagelowercase tanpa underscorecom.example.demo

Berikut contoh kode yang menerapkan keempat konvensi:

kotlin
package contoh.konvensi

// Konstanta compile-time: UPPER_SNAKE_CASE dengan const val
const val MAX_PESERTA: Int = 50
const val NAMA_APLIKASI: String = "BelajarKotlin"

// Top-level property immutable: camelCase
val versiDefault = "1.0.0"

// Function: camelCase, kata kerja
fun hitungTotalBelanja(harga: Int, qty: Int): Int {
    return harga * qty
}

// Class: PascalCase
class Pengguna(val namaPengguna: String, val umur: Int)

// Object: PascalCase
object Konfigurasi {
    val pathDatabase = "/data/app.db"
}

// Interface: PascalCase, biasanya kata sifat
interface DapatDiskon {
    fun terapkanDiskon(persen: Int): Double
}

// Backing property private: underscore prefix
class Penyimpanan {
    private var _data: String = ""
    val data: String get() = _data
}

fun main() {
    val pengguna = Pengguna("Budi", 25)
    println("$NAMA_APLIKASI v$versiDefault")
    println("Pengguna: ${pengguna.namaPengguna}, umur: ${pengguna.umur}")

    val total = hitungTotalBelanja(harga = 5000, qty = 4)
    println("Total: $total (maks peserta: $MAX_PESERTA)")

    val penyimpanan = Penyimpanan()
    println("Penyimpanan awal: '${penyimpanan.data}'")
}

Output yang Dihasilkan:

text
BelajarKotlin v1.0.0
Pengguna: Budi, umur: 25
Total: 20000 (maks peserta: 50)
Penyimpanan awal: ''

Mari kita amati penamaan pada kode di atas:

  1. Baris 4-5 (MAX_PESERTA, NAMA_APLIKASI) — konstanta compile-time dengan const val, memakai UPPER_SNAKE_CASE. Penggunaan const wajib agar nilai disematkan langsung ke bytecode sebagai konstanta.
  2. Baris 8 (versiDefault) — top-level property val biasa (bukan const) tetap memakai camelCase, karena hanya const val yang memakai UPPER_SNAKE_CASE.
  3. Baris 11 (hitungTotalBelanja) — function diawali kata kerja hitung, diikuti objek TotalBelanja. Pola kata-kerja + objek memudahkan pembaca memahami aksi function.
  4. Baris 16 (class Pengguna) — PascalCase tunggal; class biasanya kata benda.
  5. Baris 21 (object Konfigurasi) — singleton memakai PascalCase seperti class.
  6. Baris 26 (interface DapatDiskon) — interface sering memakai kata sifat yang diawali Dapat- (Can-) atau -able/-ible agar polimorfisme terbaca alami.
  7. Baris 31-34 (_data, data) — backing property private memakai underscore prefix _data, sedangkan property publik tetap camelCase. Ini adalah konvensi khusus untuk pola backing field.

Aturan camelCase #

camelCase memulai kata pertama dengan huruf kecil dan kata berikutnya dengan huruf besar. Beberapa pedoman khusus:

  • Variabel lokal singkat boleh satu kata: i, nama, total.
  • Variabel yang merepresentasikan koleksi jamak: daftarPengguna, itemTerpilih.
  • Boolean diawali is, has, can: isAktif, hasPermission, canEdit.
  • Hindari singkatan tidak jelas: gunakan konfigurasi, bukan cfg.
kotlin Contoh camelCase yang baik dan buruk
// Baik
val daftarPeserta = listOf<Pengguna>()
var isCompleted = false
fun prosesPesanan(pesanan: Pesanan): Hasil { /* ... */ }

// Buruk
val dftPsrta = listOf<Pengguna>()           // singkatan tidak jelas
var selesai = false                           // boolean tanpa prefix
fun proses(p: Pesanan): Hasil { /* ... */ }  // nama function terlalu umum

Aturan PascalCase #

PascalCase mirip camelCase tetapi kata pertama juga diawali huruf besar. Pakai untuk class, interface, object, enum class, annotation class, dan typealias:

kotlin Contoh PascalCase
class PelangganTetap(val id: String)
interface DapatDipulihkan
object CacheMemori
enum class StatusPesan { BARU, TERKIRIM, GAGAL }
annotation class Experiment(val nama: String)
typealias DaftarPengguna = List<Pengguna>

Enum constant sendiri memakai UPPER_SNAKE_CASE seperti konstanta compile-time — lihat BARU, TERKIRIM, GAGAL di atas.

Konstanta: UPPER_SNAKE_CASE dengan const val #

Konstanta yang nilainya diketahui saat kompilasi dideklarasikan dengan const val di top-level atau di companion object. Nama memakai UPPER_SNAKE_CASE:

kotlin Konstanta compile-time
const val MAX_PESERTA = 50
const val NAMA_APLIKASI = "BelajarKotlin"
const val TIMEOUT_DETIK = 30

Tanpa modifier const, property val biasa tidak dianggap konstanta compile-time meskipun tidak pernah berubah — kompilator menyimpannya sebagai field statik biasa. Aturan UPPER_SNAKE_CASE hanya berlaku untuk const val; property val lain tetap camelCase.

Nama Package #

Nama package di Kotlin sepenuhnya lowercase, tanpa underscore, dan mengikuti konvensi domain terbalik seperti Java:

text Konvensi package
com.example.demo           // benar
com.example.belajarkotlin  // benar
com.example.BelajarKotlin  // salah: huruf besar
com.example.belajar_kotlin // salah: underscore

Backing Property dengan Underscore #

Pola backing property memakai underscore prefix pada variabel private dan menyediakan property publik tanpa underscore:

kotlin Backing field pattern
class Penyimpanan {
    private var _data: String = ""
    val data: String get() = _data
}

Konvensi ini eksplisit memberi tahu pembaca bahwa _data hanya pengiring internal untuk property data. Backing field wajib dijelaskan dengan KDoc bila perilakunya tidak trivial.

Referensi Lanjutan #

Konvensi penamaan menjaga kode tetap dapat dibaca lintas tim. Setelah nama variabel, function, dan class konsisten, kita siap melihat bagaimana Kotlin mengelompokkan kode ke dalam package dan mengimpor simbol dari package lain — pembahasan lengkap menanti pada chapter Package dan Import.