Elvis Operator ایک بائنری آپریٹر ہے جو بائیں آپرینڈ کو واپس کرتا ہے اگر وہ null نہیں ہے، اور دائیں آپرینڈ کو اگر وہ null ہے۔ یۇ Kotlin، Groovy اور کچھ دیگر زبانوں میں ?: کے طور پر لکھا جاتا ہے۔ Kotlin زبان دستاویز، 2024 کے مطابق، یہ آپریٹر زبان کے null سیکورٹی سیسٹم کا حصہ ہے اور پڑھنے کی صلاحیت کو کھوئے بغیر شرطی تعمیرات کو ایک سطر تک مختصر کرنے کی اجازت دیتا ہے۔ مکمل if-else اظہار کے برعکس، Elvis Operator دائیں جانب کا صرف اس وقت حساب لگاتا ہے جب بائیں جانب null ہو، جو مہنگے پیتھ اظہارات کا استعمال کرتے وقت کارکردگی کا فائدہ دیتا ہے۔
اہم نکات
Elvis Operator ایک بائنری آپریٹر ہے جس کا نام ایلویس پریسلی کے بالوں کے انداز پر رکھا گیا ہے۔ ?: کی علامت بصورتی گلی کے اطراف سے گایک کے چہرے کی طرح لگتی ہے: سوالیہ کا نشان آنکھ اور سائیڈبرن ہے، نقطہ واوین منہ ہے۔ آپریٹر دو آپرینڈ لیتا ہے: اگر پہلا null نہیں ہے — وہ واپس کیا جاتا ہے، ورنہ دوسرا واپس کیا جاتا ہے۔ یہ مکمل if-else تعمیر کو ایک مختصر اظہار سے بدلنے کی اجازت دیتا ہے۔
«Elvis Operator» نام Kotlin اور Groovy کمیونیٹیوں میں قائم ہوا، اور پھر Xtend اور دیگر JVM زبانوں میں پھیل گیا۔ Swift اور Dart میں مناسب تعمیر کو nil-coalescing operator کہا جاتا ہے، لیکن یہ فنڧنی طور پر یکساں ہے۔ ایلویس پریسلی کے ساتھ بصری وابستگی نے آپریٹر کو جدید پروگرامنگ زبانوں کے سینٹیکس میں سب سے پہچانے جانے والی علامتوں میں سے ایک بننے میں مدد کی۔
Elvis Operator null safety سیسٹم کا حصہ ہے جو NullPointerException (NPE) کو روکتا ہے۔ JetBrains 2023 کے مطالعے کے مطابق، NPE پروڈکشن JVM کوڈ میں 28% تمام استثنائیات کا سبب ہے۔ Elvis Operator کا استعمال اسائنمنٹ کے مقام پر NPE کو مکمل طور پر ختم کرتا ہے، ایک پیتھ قیمت کی ضمانت دیتا ہے۔ محفوظ کال آپریٹر ?. کے ساتھ مرکب ہونے پر، بنا کسی ایک if بلاک کے ایک قابل بھروسہ زنجیر بنتی ہے۔
Kotlin میں، Elvis Operator دو اظہاروں کے درمیان ?: کے طور پر لکھا جاتا ہے۔ اگر بائیں اظہار null نہیں ہے — نتیجہ بائیں اظہار کے برابر ہوتا ہے، ورنہ دائیں کا حساب لگایا جاتا ہے۔ دائیں اظہار کا حساب سست طور پر لگایا جاتا ہے — صرف اس وقت جب بائیں آپرینڈ null ہو، جو مہنگے حسابوں یا 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("Timeout: $timeout")
// Elvis with throw لازمی پیرامیٹرز کے لیے
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis with return جلد خروج کے لیے
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
let کے ساتھ مرکب Kotlin میں ایک عام پیٹرن ہے، جہاں Elvis Operator ایک پیتھ قیمت فراہم کرتا ہے اور let غیر-null نتیجے پر ایک عمل کرتا ہے۔ یہ طریقہ پڑھنے کی صلاحیت کو کھوئے بغیر مکمل if-else بلاکوں کو ایک کال زنجیر سے بدل دیتا ہے۔ Elvis Operator کو throw کے ساتھ بھی استعمال کیا جا سکتا ہے تاکہ لازمی پیرامیٹر کے غیرحاضر ہونے پر جبری طور پر بند کیا جا سکے — یہ انپٹ ڈیٹا کی تصدیق کا ایک محاوری طریقہ ہے۔
Kotlin میں ایک عام پیٹرن Elvis + return ہے۔ اگر قیمت null ہے، فنڧن فورا نتیجہ واپس کرتا ہے یا ایک استثنا پھینکتا ہے۔ Elvis with return محاورہ اکثر ڈیٹا تبدیل کے فنڧنوں میں استعمال ہوتا ہے: val processed = rawData ?: return defaultValue۔ یہ Swift کے guard let سے زیادہ مختصر ہے اور کوڈ کی سطح درجے میں اضافہ نہیں کرتا۔
Elvis Operator if-else سے چھوٹا ہے اور متغیر کو دوہرانے کی ضرورت نہیں ہے۔ موازنہ کریں: val x = a ?: b بنام val x = if (a != null) a else b۔ پیچیدہ اظہارات کے ساتھ، کوڈ میں کمی 60% تک پہنچ جاتی ہے، جبکہ سیمانٹکس مکمل طور پر یکساں ہے — کامپائلر دونوں ویرینٹوں کے لیے یکی بائٹ کوڈ تیار کر سکتا ہے۔
| معیار | Elvis Operator | if-else |
|---|---|---|
| لمبائی | 1 سطر، 5–10 حروف | 3 سطروں، 15–30 حروف |
| اظہار کی تکرار | نہیں | ہاں (a != null) ? a : b |
| سست دائیں جانب | ہاں | ہاں (elvis چھوٹا ہے) |
| مطرحہ اثرات | صرف دائیں جانب | دونوں شاخوں میں |
| پڑھنے کی صلاحیت | سادہ معاملات کے لیے اعلیٰ | پیچیدہ منطق کے لیے بہتر |
Elvis Operator پیتھ قیمتیں مقرر کرنے، محفوظ رسائی کے ساتھ فنڧن کالز کو زنجیر میں بانچنے اور غائب قیمتوں کو لاگ کرنے کے لیے موزوں ہے۔ Kotlin کے محاوری پیٹرن اسے اظہاروں میں سادہ null جانچ کے لیے if-else کے متبادل کے طور پر تجویز کرتے ہیں۔ ?. کے ساتھ مرکب ہونے پر، یہ عارضی متغیرات کے بغیر کمپیکٹ زنجیریں تیار کرتا ہے۔
if-else ایک سے زیادہ شرائط کے لیے، جب مطرحہ اثرات کو نفذ کرنے کی ضرورت ہو، یا جب دونوں آپرینڈ کئی کارروائیوں کے ساتھ پیچیدہ کوڈ بلاک ہوں تب بہتر ہے۔ Elvis Operator نیسٹڈ بلاکوں کی حمایت نہیں کرتا — ہر آپرینڈ کے لیے صرف واحد اظہار۔ اگر دائیں جانب مطرحہ اثرات کے ساتھ فنڧن کو کال کرتا ہے، if-else کی پڑھنے کی صلاحیت زیادہ ہوتی ہے۔
Groovy بلکل Kotlin کی طرح ?: سینٹیکس استعمال کرتا ہے، کیونکہ دونوں زبانیں JVM پر چلتی ہیں اور null-safety کے فلسفے کو شیئر کرتی ہیں۔ یہ آپریٹر Groovy میں پہلے ظاہر ہوا — 2011 میں جاری کردہ ورشن 1.8 سے زبان میں موجود ہے۔ Groovy Elvis اسائنمنٹ کی بھی حمایت کرتا ہے: x ?= value (صرف اس وقت مقرر کریں جب x null ہو)۔
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Groovy میں Elvis اسائنمنٹ
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
Swift میں مساوی کو nil-coalescing operator کہا جاتا ہے اور ?? کے طور پر لکھا جاتا ہے۔ Dart میں بھی وہی ?? سینٹیکس استعمال ہوتا ہے۔ فرق یہ ہے کہ Swift اور Dart کو آپرینڈ قسموں کے ملان کی ضرورت ہوتی ہے، جبکہ Kotlin مشترک سوپرٹائپ میں خودکار تبدیل کے ساتھ مختلف قسموں کی اجازت دیتا ہے۔ TypeScript میں، ?? آپریٹر (nullish coalescing) ورشن 3.7 میں ظاہر ہوا اور صرف null اور undefined کے ساتھ کام کرتا ہے، || کے برعکس جو تمام falsy قیمتوں کو فلٹر کرتا ہے۔ PHP میں، ?? آپریٹر ورشن 7.0 میں، C# میں — ?? ورشن 6.0 سے ظاہر ہوا۔
سب سے عام غلطی Elvis Operator ?: کو محفوظ کال آپریٹر ?. کے ساتھ خلط کرنا ہے۔ Kotlin میں، ?. کسی میتھڈ یا پروپرٹی کو صرف اس وقت کال کرتا ہے جب آبجیکٹ null نہیں ہو، جبکہ ?: null ہونے پر ایک پیتھ قیمت واپس کرتا ہے۔ انہیں مسلسل طور پر مرکب کیا جاتا ہے، لیکن ہر اپنا کام کرتا ہے۔ خلط شدگی ان مبتدئیوں میں پیدا ہوتی ہے جو ?. کے بغیر ?: استعمال کرنے کی کوشش کرتے ہیں۔
Elvis کی دائیں جانب سست طور پر حساب لگایا جاتا ہے، لیکن اگر اس میں مطرحہ اثرات کے ساتھ فنڧن کا استعمال ہو، تو یہ غیر متوقع رویے کا سبب بن سکتا ہے۔ ڈیولپر کبھی کبھی مہنگے حسابوں یا لاگنگ کو دائیں جانب رکھتے ہیں، جو غیر-null قیمت کے وقت نفذ نہیں ہوتا۔ یاد رکھیں کہ دائیں جانب ایک اظہار ہے جو صرف ضرورت کے وقت حساب کیا جاتا ہے۔
ایک صف میں کئی Elvis کوڈ کی پڑھنائی کو مشکل بنا سکتا ہے۔ مثال کے طور پر، a ?: b ?: c ?: d بائیں سے دائیں حساب کیا جاتا ہے، پہلا غیر-null واپس کرتا ہے۔ قوصین کے ذریعے گروپنگ یا منطق کو علاحدہ فنڧن میں نکالنا پڑھنے کی صلاحیت میں بہتری لاتا ہے اور ڈیبگنگ کو آسان بناتا ہے۔ اگر زنجیر 3 انداز سے لمبی ہے، تو when اظہار یا مددگار فنڧن استعمال کرنا چاہیے۔
مبتدئی ڈیولپر کبھی کبھی بولین قیمتوں کی جانچ کے لیے Elvis Operator استعمال کرنے کی کوشش کرتے ہیں: val x = flag ?: false۔ یہ صرف اس وقت کام کرتا ہے جب flag null ہو سکتا ہے۔ null کے بغیر بولین شرائط کے لیے، ایک عام if-else یا تیسرا آپریٹر چاہیے — Kotlin میں تیسرا آپریٹر موجود نہیں ہے، لیکن if-else اظہار سے بدلا جاتا ہے: val x = if (flag) a else b۔
اکثر پوچے جانے والے سوالات
Elvis Operator صرف null کی جانچ کرتا ہے، جبکہ تیسرا آپریٹر کسی بھی بولین شرط کو قبول کرتا ہے۔ Kotlin میں تیسرا آپریٹر موجود نہیں ہے — if-else اظہار سے بدلا جاتا ہے۔ Elvis ایک مختص کام حل کرتا ہے: null ہونے پر پیتھ قیمت، جبکہ تیسرا آپریٹر تمام شرطی اظہارات کو کور کرتا ہے۔
ہاں، دائیں جانب ایک فنڧن کال ہو سکتا ہے: val x = a ?: calculateDefault()۔ سست حساب کی وجہ سے فنڧن کا حساب صرف اس وقت لگایا جاتا ہے جب a null ہو۔ یہ قیمت کے موجود ہونے پر کارکردگی کے نقصان کے بغیر مہنگے حسابوں، API کالز یا ڈیٹابیس کوئریز کا استعمال کرنے کی اجازت دیتا ہے۔
Java میں کوئی براہ راست Elvis Operator موجود نہیں ہے۔ Java 8 سے شروع کرتے ہوئے، Optional.ofNullable(value).orElse(default) استعمال کیا جا سکتا ہے۔ Java 14+ نے switch اظہارات متعارف کرائے، لیکن مکمل ?: غائب ہے۔ Kotlin اور Groovy اسے زبان کی مضمن سینٹیکٹکل تعمیر کے طور پر فراہم کرتے ہیں۔
عام پیٹرن ایک محفوظ کال ?. کے بعد Elvis ہے۔ مثال: user?.address?.city ?: «Unknown»۔ اگر زنجیر میں کوئی بھی عنصر null ہے — پیتھ قیمت واپس کی جاتی ہے۔ یہ نیسٹڈ if جانچ کا ایک کمپیکٹ متبادل ہے، روایتی طریقے کے مقابلے کوڈ کو 3–5 گونا کم کرتا ہے۔
Elvis Operator زبان کی سطح پر ایک سینٹیکٹکل تعمیر ہے، جبکہ orElse Java میں Optional کا ایک میتھڈ ہے۔ Elvis سست ہے (دائیں جانب کا حساب صرف null ہونے پر ہوتا ہے)، جبکہ orElse ہمیشہ اپنی دلیل کا حساب لگاتا ہے۔ Java میں سست قسم کے لیے orElseGet ہے جو Supplier کو قبول کرتا ہے۔ Elvis چھوٹا ہے اور Optional بنانے کی ضرورت نہیں ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں