कोटलिन साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न
\n\nसीनियर Kotlin डेवलपर पद के लिए साक्षात्कार केवल सिंटैक्स की जांच नहीं है। साक्षात्कारकर्ता भाषा की वास्तुकला, संकलन की विशेषताओं और मल्टीथ्रेडिंग की गहरी समझ देखना चाहते हैं। इस लेख में, हम सबसे कठिन और अक्सर पूछे जाने वाले प्रश्नों का विश्लेषण करेंगे जो आपको तकनीकी साक्षात्कार को आत्मविश्वास से पास करने में मदद करेंगे। यह सामग्री उन डेवलपर्स के लिए है जिनके पास पहले से Kotlin और Java के साथ काम करने का अनुभव है।
\n\n1. कोरूटीन: स्ट्रक्चर्ड कंकरेंसी और कार्यों को रद्द करना
\n\nकोरूटीन Kotlin की सबसे मजबूत विशेषताओं में से एक हैं। एक उन्नत प्रश्न अक्सर स्ट्रक्चर्ड कंकरेंसी से संबंधित होता है। साक्षात्कारकर्ता पूछ सकता है: "यदि कोई चाइल्ड कोरूटीन एक अपवाद फेंकता है और पैरेंट इसे पकड़ नहीं पाता है तो क्या होगा?"
\n\nउत्तर Job के पदानुक्रम में निहित है। यदि कोई चाइल्ड कोरूटीन (coroutineScope या launch के अंदर शुरू किया गया) अपवाद के साथ विफल होता है, तो यह पैरेंट तक पहुँचता है। पैरेंट कोरूटीन रद्द हो जाता है, और उसके सभी चाइल्ड कार्य भी रद्द हो जाते हैं। यह कोड को पूर्वानुमानित और सुरक्षित बनाता है।
एक उदाहरण जो साक्षात्कार में दिखाना चाहिए:
\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking {\n try {\n coroutineScope {\n launch {\n delay(100)\n throw RuntimeException("चाइल्ड कोरूटीन में त्रुटि")\n }\n launch {\n delay(200)\n println("यदि पहला विफल होता है तो यह कोरूटीन निष्पादित नहीं होगा")\n }\n }\n } catch (e: Exception) {\n println("अपवाद पकड़ा गया: ${e.message}")\n }\n println("प्रोग्राम काम करना जारी रखता है")\n}\n\n\nएक और सामान्य प्रश्न है कोरूटीन को रद्द करना। कोरूटीन को सही तरीके से कैसे रद्द करें? Job.cancel() का उपयोग करें और लंबे संचालन के अंदर ensureActive() या isActive के माध्यम से स्थिति की जाँच करें।
2. इनलाइन-फंक्शन और reified-प्रकार
\n\nउन्नत डेवलपर्स को समझना चाहिए कि inline-फंक्शन क्यों आवश्यक हैं। प्रश्न इस प्रकार हो सकता है: "Kotlin बिना inline के reified-प्रकारों के उपयोग की अनुमति क्यों नहीं देता?"
उत्तर: reified (मूर्त) प्रकार केवल inline-फंक्शन के अंदर काम करते हैं, क्योंकि ऐसे फंक्शन का कोड सीधे कॉल स्थान पर एम्बेड हो जाता है। कंपाइलर संकलन के समय विशिष्ट प्रकार को प्रतिस्थापित करता है, जो JVM में प्रकार मिटाने के कारण सामान्य generic-फंक्शन के लिए संभव नहीं है।
एक उदाहरण जो reified की शक्ति दर्शाता है:
\n\ninline fun <reified T> isInstance(value: Any): Boolean {\n return value is T\n}\n\nfun main() {\n println(isInstance<String>("Hello")) // true\n println(isInstance<Int>("Hello")) // false\n}\n\n\nसाथ ही noinline और crossinline के बारे में पूछा जाएगा। noinline किसी विशेष लैम्ब्डा पैरामीटर के एम्बेडिंग को प्रतिबंधित करता है, जबकि crossinline लैम्ब्डा के अंदर return (गैर-स्थानीय रिटर्न) के उपयोग को प्रतिबंधित करता है।
3. डेलिगेट: Delegates.observable, vetoable और कस्टम डेलिगेट
\n\nडेलिगेट पर प्रश्न एक क्लासिक है। उन्नत स्तर का अर्थ न केवल बिल्ट-इन डेलिगेट (lazy, observable) का ज्ञान है, बल्कि अपने स्वयं के डेलिगेट लिखने की क्षमता भी है।
उदाहरण: "एक डेलिगेट कैसे लागू करें जो प्रॉपर्टी के प्रत्येक परिवर्तन को लॉग करता है?"
\n\nimport kotlin.properties.ReadWriteProperty\nimport kotlin.reflect.KProperty\n\nclass LoggingDelegate<T>(private val initialValue: T) : ReadWriteProperty<Any?, T> {\n private var value = initialValue\n\n override fun getValue(thisRef: Any?, property: KProperty<*>): T {\n println("${property.name} पढ़ना: $value")\n return value\n }\n\n override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {\n println("${property.name} लिखना: $value")\n this.value = value\n }\n}\n\nclass User {\n var