Kotlin साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न
\n\nKotlin डेवलपर पद के लिए साक्षात्कार केवल सिंटैक्स की जाँच नहीं है। उन्नत स्तर पर, इंटरव्यूअर भाषा की गहरी समझ, इसकी विशेषताओं और कुशल, संक्षिप्त तथा सुरक्षित कोड लिखने की क्षमता देखना चाहते हैं। इस लेख में, हम तकनीकी साक्षात्कारों में अक्सर पूछे जाने वाले मुख्य विषयों को कवर करेंगे: कोरूटीन, इनलाइन फंक्शन, सील्ड क्लास, डेलीगेशन और लैम्ब्डा एक्सप्रेशन की बारीकियाँ। यह सामग्री PythonLib शैक्षिक पोर्टल के लिए तैयार की गई है, जहाँ हम डेवलपर्स को अपने ज्ञान को व्यवस्थित करने में मदद करते हैं।
\n\n1. कोरूटीन (Coroutines) और स्ट्रक्चर्ड कंकरेंसी
\nकोरूटीन Kotlin में एसिंक्रोनस प्रोग्रामिंग की नींव हैं। इस विषय पर प्रश्न यह दर्शाते हैं कि क्या आप समझते हैं कि शेड्यूलर, कॉन्टेक्स्ट और एक्सेप्शन हैंडलिंग कैसे काम करते हैं।
\n\nस्ट्रक्चर्ड कंकरेंसी क्या है और इसकी आवश्यकता क्यों है?
\nस्ट्रक्चर्ड कंकरेंसी (संरचित समवर्तीता) एक सिद्धांत है जिसमें कोरूटीन का जीवनचक्र एक स्कोप से बंधा होता है। यदि पैरेंट कोरूटीन रद्द हो जाता है, तो सभी चाइल्ड कार्य स्वचालित रूप से रद्द हो जाते हैं। यह मेमोरी लीक को रोकता है और कोड को पूर्वानुमानित बनाता है।
\n\nfun main() = runBlocking {\n launch {\n delay(1000)\n println("कार्य 1 पूर्ण")\n }\n launch {\n delay(500)\n println("कार्य 2 पूर्ण")\n }\n println("मुख्य थ्रेड ब्लॉक नहीं हुआ")\n}\n\n\nlaunch और async के बीच अंतर
\nlaunch एक कोरूटीन शुरू करता है जो कोई परिणाम नहीं लौटाता (Unit)। async एक Deferred लौटाता है, जिससे await() के माध्यम से परिणाम प्राप्त किया जा सकता है। async समानांतर गणनाओं के लिए उपयोगी है।
val deferred1 = async { calculateSum(10, 20) }\nval deferred2 = async { calculateSum(30, 40) }\nval result = deferred1.await() + deferred2.await()\nprintln("योग: $result")\n\n\nकोरूटीन में एक्सेप्शन हैंडलिंग
\nकोरूटीन के अंदर try-catch का उपयोग करें या वैश्विक हैंडलिंग के लिए CoroutineExceptionHandler का उपयोग करें। याद रखें कि launch में एक्सेप्शन पदानुक्रम में ऊपर फैलते हैं, जबकि async में वे await() कॉल तक संग्रहीत रहते हैं।
val handler = CoroutineExceptionHandler { _, exception ->\n println("त्रुटि: ${exception.message}")\n}\n\nfun main() = runBlocking {\n val job = launch(handler) {\n throw RuntimeException("कुछ गलत हो गया")\n }\n}\n\n\n2. इनलाइन फंक्शन, reified और क्रॉस-इनलाइन
\nये तंत्र प्रदर्शन को अनुकूलित करने और रनटाइम पर जेनेरिक के साथ काम करने की अनुमति देते हैं। इंटरव्यूअर अक्सर inline, noinline और crossinline के बीच अंतर के बारे में पूछते हैं।
इनलाइन फंक्शन की आवश्यकता क्यों है?
\nइनलाइन फंक्शन फंक्शन के बॉडी को सीधे कॉल साइट पर सम्मिलित करते हैं। यह लैम्ब्डा ऑब्जेक्ट बनाने के ओवरहेड को समाप्त करता है। यह विशेष रूप से higher-order फंक्शन के लिए उपयोगी है।
\n\ninline fun measureTime(action: () -> Unit) {\n val start = System.currentTimeMillis()\n action()\n println("समय: ${System.currentTimeMillis() - start} मि.से.")\n}\n\n\nreified क्या है?
\nreified के साथ, आप इनलाइन फंक्शन के अंदर टाइप के बारे में जानकारी प्राप्त कर सकते हैं, जो टाइप इरेज़र के कारण सामान्य जेनेरिक के लिए संभव नहीं है।
inline fun <reified T> isInstance(value: Any): Boolean {\n return value is T\n}\n\nfun main() {\n println(isInstance<String>("Hello")) // true\n}\n\n\nnoinline और crossinline के बीच अंतर
\n- \n
noinline— किसी विशेष लैम्ब्डा के इनलाइनिंग को प्रतिबंधित करता है (उदाहरण के लिए, यदि इसे किसी अन्य फंक्शन में पास किया जाता है)। \n crossinline— इनलाइनिंग की अनुमति देता है, लेकिन लैम्ब्डा से non-local return (गैर-स्थानीय वापसी) को प्रतिबंधित करता है, जो एसिंक्रोनस कॉल के लिए सुरक्षित है। \n