Elvis Operator: bu nədir, sintaksis və null dəyərlərin işlənməsi

Müəllif: IT Sectr Dərc olunub: 2026-05-27 Oxuma vaxtı: 8 dəq

Elvis Operator — sol operand null deyilsə onu, əks halda sağ operandı qaytaran ikili operatordur. Kotlin, Groovy və bəzi digər dillərdə ?: kimi yazılır. Kotlin Language Documentation, 2024-ə əsasən, operator dilin null-təhlükəsizlik sisteminin bir hissəsidir və oxunaqlılığı itirmədən şərti konstruksiyaları bir sətirə qədər qısaltmağa imkan verir. Tam if-else yazılışından fərqli olaraq, Elvis Operator sol hissənin null dəyərində yalnız sağ hissəni hesablayır ki, bu da bahalı ifadələrdən istifadə zamanı performans üstünlüyü verir.

Əsas məqamlar

  • Elvis Operator — ikidən ilk null olmayan operandı qaytaran ?: operatoru
  • Null safety — Elvis Operator-ın Kotlin və digər dillərdə əsas tətbiq sahəsi
  • Sintaksis olduqca yığcamdır: val result = a ?: b, if (a != null) a else b-yə ekvivalentdir
  • Groovy eyni ?: sintaksisindən istifadə edir, Swift — ?? operatoru, Dart — ??
  • Loglama Elvis Operator vasitəsilə — məşhur nümunə: val name = input ?: "default"

Elvis Operator nədir

Elvis Operator — Elvis Presley-in saç düzümünün şərəfinə adlandırılmış ikili operatordur. ?: simvolu vizual olaraq müğənninin üzünü profildən xatırladır: sual işarəsi — göz və yanaq saqqalı, iki nöqtə — ağız. Operator iki operand qəbul edir: birincisi null deyilsə — o qaytarılır, əks halda ikincisi qaytarılır. Bu, tam if-else konstruksiyasını bir qısa yazılışla əvəz etməyə imkan verir.

Adın mənşəyi

“Elvis Operator” adı KotlinGroovy icmalarında möhkəmlənmiş, daha sonra Xtend və digər JVM dillərinə keçmişdir. Swift və Dart-da oxşar konstruksiya nil-coalescing operator adlanır, lakin funksional olaraq eynidir. Elvis Presley ilə vizual assosiasiya operatoru müasir proqramlaşdırma dillərinin sintaksisində ən tanınan simvollardan birinə çevrilməsinə kömək etmişdir.

Null-un işlənməsində rolu

Elvis Operator NullPointerException (NPE) qarşısını alan null safety sisteminin bir hissəsidir. JetBrains 2023 araşdırmasına görə, NPE JVM-də istehsal kodunda bütün istisnaların 28%-ni təşkil edir. Elvis Operator-ın istifadəsi təyinat nöqtəsində NPE-ni tamamilə aradan qaldırır, standart dəyəri təmin edir. Təhlükəsiz çağırış operatoru ?. ilə birlikdə heç bir if-bloku olmadan etibarlı zəncir əldə edilir.

Kotlin-də Elvis Operator sintaksisi

Kotlin-də Elvis Operator iki ifadə arasında ?: kimi yazılır. Sol ifadə null deyilsə — nəticə sola bərabərdir, əks halda sağ ifadə hesablanır. Sağ ifadə tənbəl hesablanır — yalnız sol operand null olduqda, bu da bahalı hesablamalar və ya API çağırışlarından istifadə zamanı performans üçün vacibdir.

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("Vaxt aşımı: $timeout")

// Elvis throw ilə məcburi parametrlər üçün
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")

// Elvis return ilə erkən çıxış üçün
fun process(data: String?): Result {
    val safe = data ?: return Result.failure("No data")
    return processInternal(safe)
}

let ilə birləşdirmə — Kotlin-də tez-tez istifadə olunan nümunədir, burada Elvis Operator standart dəyəri təyin edir, let isə null olmayan nəticə ilə hərəkət edir. Bu yanaşma oxunaqlılığı itirmədən bütöv if-else bloklarını bir çağırış zənciri ilə əvəz edir. Elvis Operator həmçinin məcburi parametr olmadıqda məcburi kəsmə üçün throw ilə istifadə edilə bilər — bu, giriş məlumatlarının validasiyasının idiomatik üsuludur.

Funksiyadan erkən çıxış ilə Elvis

Kotlin-də Elvis + return nümunəsi geniş yayılmışdır. Dəyər null olarsa, funksiya dərhal nəticə qaytarır veya istisna atır. “Elvis with return” idioması tez-tez məlumat transformasiya funksiyalarında istifadə olunur: val processed = rawData ?: return defaultValue. Bu, Swift-də guard let-dən daha yığcamdır və kodun iç-içəliyini artırmır.

Elvis Operator vs if-else: müqayisə

Elvis Operator if-else-dən qısadır və dəyişənin təkrarlanmasını tələb etmir. Müqayisə edin: val x = a ?: b versus val x = if (a != null) a else b. Mürəkkəb ifadələrdə kodun qısalması 60%-ə çatır, semantika isə tamamilə eynidir — kompilyator hər iki variant üçün eyni bayt-kod yarada bilər.

MeyarElvis Operatorif-else
Yazılış uzunluğu1 sətir, 5–10 simvol3 sətir, 15–30 simvol
İfadənin təkrarlanmasıYoxBəli (a != null) ? a : b
Sağ hissənin tənbəlliyiBəliBəli (elvis daha qısa)
Yan təsirlərYalnız sağ hissədəHər iki qolda
OxunaqlılıqSadə hallarda yüksəkMürəkkəb məntiq üçün daha yaxşı

Elvis Operator nə vaxt istifadə edilməlidir

Elvis Operator standart dəyərin təyin edilməsi, təhlükəsiz girişlə funksiya zəncirlərinin çağırılması və çatışmayan dəyərlərin loglanması üçün optimaldır. Idiomatik nümunələr Kotlin onu ifadələrdə sadə null yoxlamaları üçün if-else əvəzi kimi tövsiyə edir. ?. ilə birlikdə müvəqqəti dəyişənlər olmadan yığcam zəncirlər verir.

if-else nə vaxt üstünlük təşkil edir

if-else çoxsaylı şərtlər olduqda, yan təsirləri yerinə yetirmək lazım olduqda və ya hər iki operand bir neçə əməliyyatı olan mürəkkəb kod blokları olduqda üstünlük təşkil edir. Elvis Operator iç-içə blokları dəstəkləmir — yalnız hər operand üçün tək ifadələr. Əgər sağ hissə yan təsiri olan funksiyanı çağırırsa, if-else-in oxunaqlılığı daha yüksəkdir.

Elvis Operator digər proqramlaşdırma dillərində

Groovy Kotlin ilə eyni ?: sintaksisindən istifadə edir, çünki hər iki dil JVM-də işləyir və null-safety fəlsəfəsini bölüşür. Groovy-də operator daha əvvəl — 2011-ci ildə buraxılmış 1.8 versiyasından mövcuddur. Groovy həmçinin Elvis təyinini dəstəkləyir: x ?= value (yalnız x null olduqda təyin et).

groovy
def name = getUserName()
def display = name ?: "Guest"

def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)

// Groovy-də Elvis təyini
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"

Swift-də analoq nil-coalescing operator adlanır və ?? kimi yazılır. Dart-da eyni ?? sintaksisindən istifadə olunur. Fərq ondadır ki, Swift və Dart operand tiplərinin uyğunluğunu tələb edir, Kotlin isə ümumi supertipə avtomatik çevirmə ilə müxtəlif tiplərə icazə verir. TypeScript-də 3.7 versiyasından ?? (nullish coalescing) operatoru meydana çıxmışdır ki, bu da yalnız null və undefined ilə işləyir, bütün falsy-dəyərləri süzən ||-dən fərqli olaraq. PHP-də 7.0 versiyasından ?? operatoru, C#-də isə 6.0 versiyasından ?? mövcuddur.

Elvis Operator ilə tipik səhvlər

Ən çox rast gəlinən səhv — Elvis Operator ?:-i təhlükəsiz çağırış operatoru ?. ilə qarışdırmaqdır. Kotlin-də ?. yalnız obyekt null olmadıqda metodu və ya xassəni çağırır, ?: isə null olduqda standart dəyər qaytarır. Onlar ardıcıl birləşdirilir, lakin hər biri öz funksiyasını yerinə yetirir. Qarışıqlıq yeni başlayanlarda ?. olmadan ?: istifadə etməyə çalışdıqda yaranır.

Sağ operandda yan təsirlər

Elvis-in sağ hissəsi tənbəl hesablanır, lakin orada yan təsirləri olan funksiya çağırışı yerləşərsə, bu gözlənilməz davranışa səbəb ola bilər. Proqramçılar bəzən sağ hissədə null olmayan dəyərdə yerinə yetirilməyən bahalı hesablamalar və ya loglama yerləşdirirlər. Sağ hissənin yalnız zəruri olduqda hesablanan ifadə olduğunu xatırlamaq vacibdir.

Qruplaşdırmadan Elvis zəncirləri

Ardıcıl çoxsaylı Elvis kodun oxunmasını çətinləşdirə bilər. Məsələn, a ?: b ?: c ?: d soldan sağa yerinə yetirilir, ilk null olmayanı qaytarır. Qruplaşdırma mötərizələr və ya məntiqin ayrıca funksiyaya çıxarılması oxunaqlılığı artırır və debug-u asanlaşdırır. Əgər zəncir 3 elementdən uzundursa, when ifadəsi və ya köməkçi funksiyadan istifadə etmək daha yaxşıdır.

Elvis boolean şərtlərlə if-else əvəzinə

Yeni başlayan proqramçılar bəzən boolean dəyərləri yoxlamaq üçün Elvis Operator-dan istifadə etməyə çalışırlar: val x = flag ?: false. Bu yalnız flag null ola bildikdə işləyir. Null olmayan boolean şərtlər üçün adi if-else və ya üçlü operator lazımdır, Kotlin-də belə operator yoxdur, lakin onu if-else ifadəsi əvəz edir: val x = if (flag) a else b.

Tez-tez verilən suallar

Elvis Operator üçlü operatordan nə ilə fərqlənir?

Elvis Operator yalnız null yoxlayır, üçlü operator isə istənilən boolean şərti qəbul edir. Kotlin-də üçlü operator yoxdur — onu if-else ifadəsi əvəz edir. Elvis bir konkret vəzifəni həll edir: null olduqda standart dəyər, üçlü operator isə bütün şərti ifadələri əhatə edir.

Elvis Operator funksiyalarla istifadə edilə bilərmi?

Bəli, sağ hissədə funksiya çağırışı ola bilər: val x = a ?: calculateDefault(). Funksiya yalnız a-nın null dəyərində tənbəl hesablama sayəsində hesablanır. Bu, dəyər mövcud olduqda performans itkisi olmadan bahalı hesablamalar, API çağırışları və ya verilənlər bazası sorğularından istifadə etməyə imkan verir.

Java-da Elvis Operator varmı?

Java-da birbaşa Elvis Operator yoxdur. Java 8-dən etibarən Optional.ofNullable(value).orElse(default) istifadə edilə bilər. Java 14+-də switch ifadələri meydana çıxmışdır, lakin tam ?: mövcud deyil. Kotlin və Groovy onu dilin daxili sintaktik konstruksiyası kimi təqdim edir.

Elvis Operator çağırış zəncirləri ilə necə işləyir?

Tipik nümunə: safe call ?. sonra Elvis. Nümunə: user?.address?.city ?: "Unknown". Zəncirin hər hansı elementi null olarsa — standart dəyər qaytarılır. Bu, iç-içə if yoxlamalarının yığcam əvəzidir, ənənəvi yanaşma ilə müqayisədə kodu 3–5 dəfə qısaldır.

Elvis Operator və Optional-da orElse arasında nə fərq var?

Elvis Operator dil səviyyəsində sintaktik konstruksiyadır, orElse isə Java-da Optional metodudur. Elvis tənbəl yerinə yetirilir (sağ hissə yalnız null olduqda hesablanır), orElse həmişə arqumenti hesablayır. Java-da tənbəl variant üçün Supplier qəbul edən orElseGet mövcuddur. Elvis daha qısadır və Optional yaratmağı tələb etmir.

Nəticə

  • Elvis Operator — null-operandda standart dəyər təyin etmək üçün ?: operatoru
  • Sintaksis Kotlin və Groovy-də: val result = a ?: b, burada b yalnız a == null olduqda hesablanır
  • Null safety — NullPointerException qarşısını alan əsas tətbiq sahəsi
  • Nil-coalescing — Swift (??) və Dart (??) dilində analoji semantika ilə, TypeScript-də 3.7 versiyasından ??
  • Birləşdirmə safe call ?. ilə iç-içəlik olmadan null dəyərlərin işlənməsi üçün yığcam zəncir verir
  • Tənbəl hesablama sağ operandın — üçlü operatordan əsas fərqi
  • Best practice — sadə null yoxlamaları üçün istifadə etmək, yan təsirləri olan mürəkkəb bloklardan qaçmaq

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun