Elvis Operator एक बाइनरी ऑपरेटर है जो लेफ्ट ऑपरेंड को लौटाता है यदि वह null नहीं है, और अन्यथा राइट ऑपरेंड को लौटाता है। इसे Kotlin, Groovy और कुछ अन्य भाषाओं में ?: के रूप में लिखा जाता है। Kotlin Language Documentation, 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 throw के साथ अनिवार्य पैरामीटर के लिए
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें