Elvis Operator: apa itu, sintaksis dan penanganan nilai null

Penulis: IT Sectr Diterbitkan: 2026-05-27 Waktu membaca: 8 mnt

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 ?: yang mengembalikan operand non-null pertama dari dua
  • Null safety — area utama penerapan Elvis Operator di Kotlin dan bahasa lainnya
  • Sintaksis sangat ringkas: val result = a ?: b, setara dengan if (a != null) a else b
  • Groovy menggunakan sintaksis ?: yang sama, Swift — operator ??, Dart — ??
  • Logging melalui Elvis Operator — pola populer: val name = input ?: "default"

Apa itu Elvis Operator

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.

Asal usul nama

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.

Peran dalam penanganan null

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.

Sintaksis Elvis Operator di Kotlin

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.

kotlin
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.

Elvis dengan keluar awal dari fungsi

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 vs if-else: perbandingan

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.

KriteriaElvis Operatorif-else
Panjang penulisan1 baris, 5–10 karakter3 baris, 15–30 karakter
Pengulangan ekspresiTidakYa (a != null) ? a : b
Sisi kanan malasYaYa (elvis lebih pendek)
Efek sampingHanya di sisi kananDi kedua cabang
KeterbacaanTinggi untuk kasus sederhanaLebih baik untuk logika kompleks

Kapan menggunakan Elvis Operator

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.

Kapan if-else lebih disukai

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.

Elvis Operator di bahasa pemrograman lainnya

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).

groovy
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 umum dengan Elvis Operator

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.

Efek samping di operand kanan

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.

Rantai Elvis tanpa pengelompokan

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.

Elvis alih-alih if-else dengan kondisi boolean

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

Apa perbedaan Elvis Operator dengan operator ternary?

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.

Bisakah Elvis Operator digunakan dengan fungsi?

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.

Apakah Elvis Operator ada di Java?

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.

Bagaimana Elvis Operator bekerja dengan rantai panggilan?

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.

Apa perbedaan antara Elvis Operator dan orElse di Optional?

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

  • Elvis Operator — operator ?: untuk menetapkan nilai default saat operand null
  • Sintaksis di Kotlin dan Groovy: val result = a ?: b, di mana b dihitung hanya saat a == null
  • Null safety — area utama penerapan, mencegah NullPointerException
  • Nil-coalescing — analog di Swift (??) dan Dart (??) dengan semantik serupa, di TypeScript — ?? sejak versi 3.7
  • Kombinasi dengan safe call ?. memberikan rantai ringkas penanganan nilai null tanpa nesting
  • Evaluasi malas operand kanan — perbedaan utama dari operator ternary
  • Best practice — gunakan untuk pemeriksaan null sederhana, hindari di blok kompleks dengan efek samping

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.

Diskusikan proyek

Baca juga