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 — 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.
“Elvis Operator” adı Kotlin və Groovy 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.
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 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.
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.
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 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.
| Meyar | Elvis Operator | if-else |
|---|---|---|
| Yazılış uzunluğu | 1 sətir, 5–10 simvol | 3 sətir, 15–30 simvol |
| İfadənin təkrarlanması | Yox | Bəli (a != null) ? a : b |
| Sağ hissənin tənbəlliyi | Bəli | Bəli (elvis daha qısa) |
| Yan təsirlər | Yalnız sağ hissədə | Hər iki qolda |
| Oxunaqlılıq | Sadə hallarda yüksək | Mürəkkəb məntiq üçün daha yaxşı |
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 ç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.
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).
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.
Ə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.
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.
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.
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 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.
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 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.
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 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ə
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.
Həm də oxuyun