Kotlin - Void vs. Unit vs. Nothing: 2025 में सर्वोत्तम अभ्यास
\n\nनमस्ते साथियों! यदि आपने कभी Kotlin में लिखा है और सोचा है: "यहाँ Unit क्यों है, void क्यों नहीं? और Nothing क्या चीज़ है?" — तो आप सही जगह पर आए हैं। यह विषय Stack Overflow पर हज़ारों व्यूज़ के साथ एक वास्तविक हिट है, और यह व्यर्थ नहीं है। Void, Unit और Nothing के बीच भ्रम एक अनुभवी डेवलपर को भी भटका सकता है। 2025 में, जब Kotlin बैकएंड (Ktor, Spring) और Android में मजबूती से अपनी जगह बना रहा है, इन प्रकारों को समझना कोई सनक नहीं, बल्कि स्वच्छ, सुरक्षित और अभिव्यंजक कोड लिखने के लिए एक आवश्यकता है।
इस लेख में हम केवल परिभाषाएँ सूचीबद्ध नहीं करेंगे। हम उन्हें वास्तविक उदाहरणों के साथ समझाएंगे, दिखाएंगे कि उनमें से प्रत्येक कहाँ उपयुक्त है और कहाँ इसका उपयोग एक बड़ी गलती है। चलिए शुरू करते हैं!
\n\nमुख्य बात संक्षेप में: क्या क्या है?
\n\nआइए तुरंत स्पष्ट कर दें। ये तीन प्रकार अलग-अलग समस्याओं का समाधान करते हैं, हालाँकि पहली नज़र में ये समान लगते हैं।
\n\n- \n
Void— यह Java का अवशेष है। Kotlin में यह केवल अनुकूलता के लिए मौजूद है। शुद्ध Kotlin कोड में इसका कभी उपयोग न करें। \n Unit— इसका अर्थ है "मैं कुछ वापस नहीं कर रहा हूँ, लेकिन मैं फिर भी एक प्रकार हूँ"। Java मेंvoidका एनालॉग, लेकिन बेहतर। इसका उपयोग 99% मामलों में किया जाता है जब फ़ंक्शन कोई सार्थक परिणाम वापस नहीं करता है। \n Nothing— इसका अर्थ है "फ़ंक्शन कभी सामान्य रूप से समाप्त नहीं होगा"। यह या तो एक अपवाद फेंकेगा या एक अनंत लूप में चला जाएगा। यह निष्पादन प्रवाह को नियंत्रित करने के लिए एक शक्तिशाली उपकरण है। \n
सरल लगता है? आइए गहराई में जाएँ।
\n\nVoid — अपनों में पराया
\n\nयदि आप शुद्ध Kotlin में लिख रहे हैं, तो Void को एक बुरे सपने की तरह भूल जाइए। यह Java (java.lang.Void) का एक क्लास है, जो कीवर्ड void के लिए एक रैपर है। यह Kotlin में विशेष रूप से Java कोड के साथ इंटरैक्शन के लिए मौजूद है।
एक उदाहरण जब Void आपके प्रोजेक्ट में दिखाई दे सकता है:
import java.lang.Void\n\n// शुद्ध Kotlin में ऐसा कभी न करें!\nfun doSomething(): Void? {\n println("कुछ कर रहा हूँ...")\n return null // अनिवार्य रूप से null लौटाना होगा, अन्यथा कंपाइलेशन त्रुटि\n}\n\nयह return null देख रहे हैं? यह मुख्य नुकसान है। Void का कोई इंस्टेंस नहीं बनाया जा सकता (इसका प्राइवेट कंस्ट्रक्टर है), लेकिन यह null हो सकता है। यह भ्रम और अनावश्यक कोड को जन्म देता है।
2025 के लिए सर्वोत्तम अभ्यास: Void का उपयोग केवल तभी करें जब आप किसी Java लाइब्रेरी से किसी मेथड को ओवरराइड कर रहे हों जिसे जेनेरिक पैरामीटर के रूप में Void की आवश्यकता हो। उदाहरण के लिए, Callable<Void> में। अन्य सभी मामलों में, Unit का उपयोग करें।
Unit — खाली फ़ंक्शनों का राजा
\n\nUnit यह कहने का वास्तविक Kotlin तरीका है: "फ़ंक्शन निष्पादित हो गया है, लेकिन परिणाम में मेरी रुचि नहीं है"। void के विपरीत, Unit एक पूर्ण प्रकार है जिसका एकमात्र मान Unit है।
यह शानदार संभावनाएँ प्रदान करता है:
\n\n- \n
- जेनेरिक्स. आप सामान्यीकृत फ़ंक्शनों में
Unitका उपयोग कर सकते हैं। \n - उच्च-क्रम फ़ंक्शन. आप
Unitलौटाने वाले फ़ंक्शन को एक तर्क के रूप में पास कर सकते हैं। \n - एक्सटेंशन. आप एक्सटेंशन फ़ंक्शन लिख सकते हैं जो
Unitलौटाते हैं। \n
एक मानक उदाहरण — लैम्ब्डा एक्सप्रेशन:
\n\nfun executeAction(action: () -> Unit) {\n println("कार्रवाई की तैयारी...")\n action() // पास किए गए फ़ंक्शन को कॉल करें\n println("कार्रवाई पूरी हुई।")\n}\n\nfun main() {\n // लैम्ब्डा जो कुछ वापस नहीं करता, लेकिन साइड-इफ़ेक्ट करता है\n executeAction {\n println("लैम्ब्डा से नमस्ते!")\n }\n}\n\nयहाँ