Elvis Operator — adalah operator biner yang mengembalikan operand kiri jika tidak null, dan operand kanan jika sebaliknya. Ditulis sebagai ?: di Kotlin, Groovy, dan beberapa bahasa lainnya. Menurut Kotlin Language Documentation, 2024, operator ini adalah bagian dari sistem null-safety bahasa dan memungkinkan untuk mempersingkat konstruksi kondisional menjadi satu baris tanpa kehilangan keterbacaan. Tidak seperti penulisan if-else lengkap, Elvis Operator menghitung bagian kanan hanya ketika nilai kiri null, yang memberikan keuntungan kinerja saat menggunakan ekspresi default yang mahal.
Poin Utama
Elvis Operator — operator biner yang dinamai sesuai gaya rambut Elvis Presley. Simbol ?: secara visual mengingatkan pada wajah penyanyi dari samping: tanda tanya — mata dan cambang, titik dua — mulut. Operator menerima dua operand: jika yang pertama tidak null — ia dikembalikan, jika tidak — yang kedua dikembalikan. Ini memungkinkan untuk mengganti konstruksi if-else lengkap dengan satu penulisan pendek.
Nama “Elvis Operator” mengakar di komunitas Kotlin dan Groovy, kemudian berpindah ke Xtend dan bahasa JVM lainnya. Di Swift dan Dart, konstruksi serupa disebut nil-coalescing operator, tetapi secara fungsional identik. Asosiasi visual dengan Elvis Presley membantu operator menjadi salah satu simbol paling dikenal dalam sintaksis bahasa pemrograman modern.
Elvis Operator adalah bagian dari sistem null safety yang mencegah NullPointerException (NPE). Menurut penelitian JetBrains 2023, NPE merupakan 28% dari semua pengecualian dalam kode produksi di JVM. Penggunaan Elvis Operator sepenuhnya menghilangkan NPE di titik penugasan, menjamin nilai default. Dalam kombinasi dengan operator panggilan aman ?. diperoleh rantai yang andal tanpa satu blok if pun.
Di Kotlin, Elvis Operator ditulis sebagai ?: di antara dua ekspresi. Jika ekspresi kiri tidak null — hasilnya sama dengan kiri, jika tidak — ekspresi kanan dihitung. Ekspresi kanan dihitung secara malas — hanya ketika operand kiri null, yang penting untuk kinerja saat menggunakan perhitungan mahal atau panggilan API.
val name: String? = getUserName()
val displayName = name ?: "Guest"
fun getLength(str: String?): Int {
return str?.length ?: 0
}
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Waktu habis: $timeout")
// Elvis dengan throw untuk parameter wajib
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis dengan return untuk keluar awal
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Kombinasi dengan let — pola umum di Kotlin, di mana Elvis Operator menetapkan nilai default, dan let melakukan tindakan dengan hasil non-null. Pendekatan ini menggantikan seluruh blok if-else dengan satu rantai panggilan tanpa kehilangan keterbacaan. Elvis Operator juga dapat digunakan dengan throw untuk penghentian paksa saat parameter wajib tidak ada — ini adalah cara idiomatis untuk memvalidasi data masukan.
Di Kotlin, pola Elvis + return tersebar luas. Jika nilainya null, fungsi segera mengembalikan hasil atau melempar pengecualian. Idiom “Elvis with return” sering digunakan dalam fungsi transformasi data: val processed = rawData ?: return defaultValue. Ini lebih ringkas daripada guard let di Swift dan tidak meningkatkan nesting kode.
Elvis Operator lebih pendek dari if-else dan tidak memerlukan pengulangan variabel. Bandingkan: val x = a ?: b versus val x = if (a != null) a else b. Pada ekspresi kompleks, pengurangan kode mencapai 60%, sementara semantik sepenuhnya identik — kompiler dapat menghasilkan byte-code yang sama untuk kedua varian.
| Kriteria | Elvis Operator | if-else |
|---|---|---|
| Panjang penulisan | 1 baris, 5–10 karakter | 3 baris, 15–30 karakter |
| Pengulangan ekspresi | Tidak | Ya (a != null) ? a : b |
| Sisi kanan malas | Ya | Ya (elvis lebih pendek) |
| Efek samping | Hanya di sisi kanan | Di kedua cabang |
| Keterbacaan | Tinggi untuk kasus sederhana | Lebih baik untuk logika kompleks |
Elvis Operator optimal untuk menetapkan nilai default, memanggil rantai fungsi dengan akses aman, dan mencatat nilai yang hilang. Pola idiomatis Kotlin merekomendasikannya sebagai pengganti if-else untuk pemeriksaan null sederhana dalam ekspresi. Dalam kombinasi dengan ?. memberikan rantai ringkas tanpa variabel sementara.
if-else tetap lebih disukai untuk kondisi berganda, saat perlu melakukan efek samping, atau ketika kedua operand adalah blok kode kompleks dengan beberapa operasi. Elvis Operator tidak mendukung blok bersarang — hanya ekspresi tunggal untuk setiap operand. Jika sisi kanan memanggil fungsi dengan efek samping, keterbacaan if-else lebih tinggi.
Groovy menggunakan sintaksis ?: yang persis sama dengan Kotlin, karena kedua bahasa berjalan di JVM dan berbagi filosofi null-safety. Di Groovy, operator muncul lebih awal — sudah ada dalam bahasa sejak versi 1.8, dirilis pada tahun 2011. Groovy juga mendukung penugasan Elvis: x ?= value (tetapkan hanya jika x null).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Penugasan Elvis di Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
Di Swift, analognya disebut nil-coalescing operator dan ditulis sebagai ??. Di Dart digunakan sintaksis ?? yang sama. Perbedaannya adalah Swift dan Dart memerlukan kecocokan tipe operand, sementara Kotlin mengizinkan tipe berbeda dengan konversi otomatis ke supertipe umum. Di TypeScript sejak versi 3.7 muncul operator ?? (nullish coalescing), yang hanya bekerja dengan null dan undefined, tidak seperti || yang memfilter semua nilai falsy. Di PHP sejak versi 7.0 muncul operator ??, di C# — ?? sejak versi 6.0.
Kesalahan paling umum — mencampuradukkan Elvis Operator ?: dengan operator panggilan aman ?. Di Kotlin, ?. memanggil metode atau properti hanya jika objek tidak null, sedangkan ?: mengembalikan nilai default saat null. Keduanya digabungkan secara berurutan, tetapi masing-masing menjalankan fungsinya sendiri. Kebingungan muncul pada pemula yang mencoba menggunakan ?: tanpa ?. sebelumnya.
Sisi kanan Elvis dihitung secara malas, tetapi jika di dalamnya terdapat panggilan fungsi dengan efek samping, hal ini dapat menyebabkan perilaku yang tidak diharapkan. Pengembang terkadang menempatkan perhitungan mahal atau logging di sisi kanan yang tidak dieksekusi saat nilai tidak null. Penting untuk diingat bahwa sisi kanan adalah ekspresi yang dihitung hanya jika diperlukan.
Beberapa Elvis berurutan dapat mempersulit pembacaan kode. Misalnya, a ?: b ?: c ?: d dieksekusi dari kiri ke kanan, mengembalikan non-null pertama. Pengelompokan melalui tanda kurung atau memisahkan logika ke fungsi terpisah meningkatkan keterbacaan dan memudahkan debugging. Jika rantai lebih panjang dari 3 elemen, sebaiknya gunakan ekspresi when atau fungsi pembantu.
Pengembang pemula terkadang mencoba menggunakan Elvis Operator untuk memeriksa nilai boolean: val x = flag ?: false. Ini hanya berfungsi jika flag bisa null. Untuk kondisi boolean tanpa null diperlukan if-else biasa atau operator ternary, yang tidak ada di Kotlin, tetapi digantikan oleh ekspresi if-else: val x = if (flag) a else b.
Pertanyaan yang Sering Diajukan
Elvis Operator hanya memeriksa null, sedangkan operator ternary menerima kondisi boolean apa pun. Di Kotlin tidak ada operator ternary — digantikan oleh ekspresi if-else. Elvis menyelesaikan satu tugas spesifik: nilai default saat null, sedangkan operator ternary mencakup semua ekspresi kondisional.
Ya, di sisi kanan bisa berupa panggilan fungsi: val x = a ?: calculateDefault(). Fungsi dihitung hanya saat nilai a null berkat evaluasi malas. Ini memungkinkan penggunaan perhitungan mahal, panggilan API, atau kueri database tanpa kehilangan kinerja saat nilai ada.
Di Java tidak ada Elvis Operator langsung. Mulai Java 8 dapat menggunakan Optional.ofNullable(value).orElse(default). Di Java 14+ muncul ekspresi switch, tetapi ?: lengkap tidak ada. Kotlin dan Groovy menyediakannya sebagai konstruksi sintaksis bawaan bahasa.
Pola tipikal: safe call ?. lalu Elvis. Contoh: user?.address?.city ?: "Unknown". Jika elemen rantai mana pun null — nilai default dikembalikan. Ini adalah pengganti ringkas untuk pemeriksaan if bersarang yang mempersingkat kode 3–5 kali dibandingkan dengan pendekatan tradisional.
Elvis Operator adalah konstruksi sintaksis di tingkat bahasa, orElse adalah metode Optional di Java. Elvis dieksekusi secara malas (sisi kanan dihitung hanya saat null), orElse selalu menghitung argumen. Untuk varian malas di Java ada orElseGet yang menerima Supplier. Elvis lebih pendek dan tidak memerlukan pembuatan Optional.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga