Kotlin: सटीक निशाना या चूक?
\nKotlin सिर्फ 'बॉयलरप्लेट के बिना Java' नहीं है। यह एक ऐसी भाषा है जिसने Google को अपने दिल में बसा लिया, Swift को विकास दर में पीछे छोड़ दिया, और मोबाइल डेवलपर्स की नौकरियों में अनिवार्य बन गई। लेकिन यहाँ विरोधाभास है: कई लोग साक्षात्कार में 'मुझे Java आती है - मैं संभाल लूंगा' सोचकर आते हैं, और लाल आँखों से बाहर निकलते हैं। क्योंकि Kotlin एक अलग दुनिया है: null के बिना, कोरूटीन और extension functions के साथ, जो पैटर्न को तोड़ देते हैं।
\nहम PythonLib में (हाँ, हम Python के बारे में हैं, लेकिन Kotlin आधुनिक बैकएंड और मोबाइल के लिए अनिवार्य है) ने एक वास्तविक केस एकत्र किया है: Kotlin साक्षात्कार को शानदार ढंग से कैसे पास करें। कोई बेकार बात नहीं - केवल कोड, तर्क और गुप्त तरकीबें जिनके बारे में पाठ्यक्रमों में चुप रहते हैं।
\n\n1. Kotlin 'सिर्फ Java 2.0' क्यों नहीं है?
\nपहला प्रश्न जो आपसे पूछा जाएगा: 'Kotlin और Java के बीच मूलभूत अंतर क्या है?'। यदि आप कहते हैं 'सिंटैक्स छोटा है' - तो आपको विनम्रता से बाहर जाने के लिए कहा जाएगा। मुख्य अंतर टाइप स्तर पर null safety है। Java में आप किसी ऑब्जेक्ट को null के लिए जाँचना भूल सकते हैं और रनटाइम पर NPE प्राप्त कर सकते हैं। Kotlin में कंपाइलर आपको कोड को कंपाइल करने भी नहीं देगा यदि null का जोखिम है।
\n// Java\nString name = null;\nint length = name.length(); // रनटाइम पर NPE\n\n// Kotlin\nvar name: String? = null\nval length = name?.length ?: 0 // सुरक्षित: length = 0\nलेकिन यह बुनियादी है। साक्षात्कारकर्ता गहराई में जाएगा: !! (non-null assertion), एल्विस ऑपरेटर ?: और सुरक्षित कॉल ?. के बारे में पूछेगा। आपका काम यह दिखाना है कि आप समझते हैं: !! बुराई है, और ?: आपका मित्र है।
- \n
- Safe call (?.) — यदि ऑब्जेक्ट null है, तो null लौटाता है। \n
- Elvis (?:) — यदि बाईं ओर null है, तो दाईं ओर का मान लें। \n
- !! — केवल तभी उपयोग करें यदि आप 100% सुनिश्चित हैं, अन्यथा - बग। \n
2. Extension functions: जादू जिसे समझाने की जरूरत है
\nप्रश्न: 'आप उस क्लास में एक मेथड कैसे जोड़ेंगे जिसे आप बदल नहीं सकते?'। Java में - Decorator पैटर्न या Util-क्लास। Kotlin में - extension functions। यह क्लास का वास्तविक परिवर्तन नहीं है, बल्कि सिंटैक्टिक शुगर है जो कोड को पढ़ने योग्य बनाता है।
\n// String के लिए Extension function\nfun String.isEmail(): Boolean {\n return this.contains("@") && this.contains(".")\n}\n\n// उपयोग\nval email = "user@pythonlib.ru"\nprintln(email.isEmail()) // true\nसाक्षात्कारकर्ता पूछ सकता है: 'क्या extension function को ओवरराइड किया जा सकता है?'। उत्तर: नहीं, यह स्टैटिक कॉल है, डायनामिक नहीं। यदि आप क्लास में समान नाम वाला फंक्शन घोषित करते हैं, तो क्लास मेथड को प्राथमिकता मिलती है।
\n\n3. Sealed class बनाम Enum: कब क्या उपयोग करें?
\nयह मिडल-लेवल पर एक क्लासिक प्रश्न है। Enum - स्थिरांकों के निश्चित सेट के लिए (सप्ताह के दिन, स्थितियाँ)। Sealed class - टाइपों के सीमित पदानुक्रम के लिए, जहाँ प्रत्येक तत्व की अपनी स्थिति हो सकती है।
\nsealed class Result {\n data class Success(val data: String) : Result()\n data class Error(val code: Int, val message: String) : Result()\n object Loading : Result()\n}\n\nfun handleResult(result: Result) {\n when (result) {\n is Result.Success -> println("Data: ${result.data}")\n is Result.Error -> println("Error ${result.code}: ${result.message}")\n Result.Loading -> println("Loading...")\n }\n}\nयह क्यों महत्वपूर्ण है? क्योंकि sealed class के साथ when यह गारंटी है कि आपने सभी मामलों को संभाल लिया है। यदि आप sealed class में एक नया टाइप जोड़ते हैं तो कंपाइलर आपको इसे भूलने नहीं देगा।
4. कोरूटीन: एसिंक्रोनस में कैसे असफल न हों
\nवह विषय जिस पर 70% उम्मीदवार असफल होते हैं। कोरूटीन थ्रेड नहीं हैं। ये हल्के 'धागे' हैं जो थ्रेड को ब्लॉक किए बिना रुक सकते हैं।
\nsuspend fun fetchData(): String {\n delay(1000) // थ्रेड को ब्लॉक नहीं करता!\n return "PythonLib से डेटा"\n}\n\nfun main() = runBlocking {\n launch {\n val result = fetchData()\n