Kotlin में «instanceof»: यह Java जैसा क्यों नहीं है, और यह कोड को कैसे स्वच्छ बनाता है
\n\nयदि आप Java की दुनिया से Kotlin में आए हैं, तो आप शायद instanceof कीवर्ड के आदी हैं। यह जानने में मदद करता है कि कोई ऑब्जेक्ट किसी विशेष क्लास का इंस्टेंस है या नहीं। लेकिन Kotlin में यह ऑपरेटर नहीं है। और यह कोई बग नहीं, बल्कि एक फीचर है।
Kotlin ऑब्जेक्ट के प्रकार की जाँच करने का एक अधिक सुरुचिपूर्ण, सुरक्षित और संक्षिप्त तरीका प्रदान करता है — ऑपरेटर is। यह न केवल "तुम कौन हो?" प्रश्न का उत्तर देता है, बल्कि ऑब्जेक्ट को स्वचालित रूप से आवश्यक प्रकार में बदल भी देता है। इसे स्मार्ट कास्ट (smart cast) कहा जाता है, और यह उन विशेषताओं में से एक है जो Kotlin में कोड को इतना सुखद बनाती हैं।
इस गाइड में, हम चर्चा करेंगे:
\n- \n
instanceofके बजाय ऑपरेटरisका उपयोग कैसे करें; \n - स्मार्ट कास्ट क्या है और यह कैसे काम करता है; \n
whenके साथ कई प्रकारों को खूबसूरती से कैसे संभालें; \n - सुरक्षित कास्ट
as?सामान्यasसे कैसे अलग है; \n - और, निश्चित रूप से, वास्तविक कोड उदाहरण। \n
चलिए शुरू करते हैं!
\n\n1. is ऑपरेटर — instanceof का सीधा एनालॉग
\n\nJava में आप लिखेंगे:
\nif (obj instanceof String) {\n String str = (String) obj;\n System.out.println(str.length());\n}\n\nKotlin में यही इस तरह दिखता है:
\nif (obj is String) {\n println(obj.length) // स्मार्ट कास्ट! obj अब String है\n}\n\nध्यान दें: obj is String की जाँच के बाद, आपको obj को स्पष्ट रूप से String प्रकार में बदलने की आवश्यकता नहीं है। Kotlin कंपाइलर स्वयं जानता है कि if ब्लॉक के अंदर, वेरिएबल obj निश्चित रूप से एक स्ट्रिंग है। इसे ही स्मार्ट कास्ट (smart cast) कहते हैं।
यह हुड के नीचे कैसे काम करता है?
\nकंपाइलर निष्पादन प्रवाह का विश्लेषण करता है। यदि वह is जाँच देखता है और जाँच और उपयोग के बीच वेरिएबल के प्रकार को बदलने की कोई संभावना नहीं पाता (उदाहरण के लिए, मल्टीथ्रेडेड कोड में या var को बदलने पर), तो वह स्वचालित रूप से प्रकार बदल देता है। val के लिए यह हमेशा काम करता है, var के लिए — केवल तभी जब जाँच और उपयोग के बीच वेरिएबल को बदला न जा सके।
2. निषेध: !is
\n\nयह जाँचना चाहते हैं कि ऑब्जेक्ट प्रकार से संबंधित नहीं है? !is का उपयोग करें:
if (obj !is String) {\n println("यह स्ट्रिंग नहीं है")\n} else {\n // यहाँ obj स्वचालित रूप से String बन गया\n println("स्ट्रिंग की लंबाई: ${obj.length}")\n}\n\nसुविधाजनक और पढ़ने योग्य, है ना?
\n\n3. when के साथ एकाधिक जाँच
\n\nअब कल्पना करें कि आपके पास एक ऑब्जेक्ट है जो कई प्रकारों में से एक हो सकता है। Java में आप instanceof के साथ if-else if की श्रृंखला लिखेंगे। Kotlin में एक अधिक सुरुचिपूर्ण उपकरण है — when संरचना।
fun describe(obj: Any): String {\n return when (obj) {\n is String -> "लंबाई ${obj.length} की स्ट्रिंग"\n is Int -> "पूर्णांक: $obj"\n is List<*> -> "${obj.size} तत्वों की सूची"\n is Map<*, *> -> "${obj.size} प्रविष्टियों का मैप"\n else -> "अज्ञात प्रकार"\n }\n}\n\nfun main() {\n println(describe("नमस्ते")) // लंबाई 6 की स्ट्रिंग\n println(describe(42)) // पूर्णांक: 42\n println(describe(listOf(1,2)))// 2 तत्वों की सूची\n}\n\nध्यान दें: when की प्रत्येक शाखा के अंदर, स्मार्ट कास्ट भी काम करता है! is String शाखा में, वेरिएबल obj पहले से ही एक स्ट्रिंग माना जाता है, और आप बिना अतिरिक्त कास्ट के obj.length कॉल कर सकते हैं।
यह क्लासिक switch या if श्रृंखला की तुलना में कहीं अधिक संक्षिप्त और सुरक्षित है।
4. सुरक्षित कास्ट: as?
\n\nकभी-कभी आपको केवल प्रकार की जाँच करने की नहीं, बल्कि तुरंत एक विशिष्ट प्रकार का मान प्राप्त करने की आवश्यकता होती है। Java में आप (String) obj करेंगे