Kotlin const vs val: अंतर और सही विकल्प कैसे चुनें?
\n\nआप Kotlin में कोड लिख रहे हैं और अचानक सोचते हैं: "आखिर const और val में क्या फर्क है? दोनों तो अपरिवर्तनीय (immutable) लगते हैं?" बहुत अच्छा सवाल! यह बात Java या दूसरी भाषाओं से आने वाले अनुभवी डेवलपर्स को भी कन्फ्यूज कर देती है। कोई आश्चर्य नहीं कि Stack Overflow पर "What is the difference between 'const' and 'val'?" टॉपिक को हज़ारों व्यूज़ मिलते हैं। आज हम इस सवाल का हमेशा के लिए समाधान करेंगे, थ्योरी को आसानी से समझेंगे और लाइव कोड उदाहरणों के साथ इसे पक्का करेंगे।
तैयार हैं? चलिए शुरू करते हैं!
\n\nसंक्षिप्त परिचय: val क्या है?
\n\nसबसे आसान चीज़ से शुरू करते हैं। val (value यानी मान से) एक अपरिवर्तनीय रेफरेंस है। आप इसे एक बार मान असाइन कर सकते हैं और फिर कभी नहीं बदल सकते। परिचित लगता है? हाँ, यह Java के final या C# के readonly जैसा है।
val name: String = "आलिया"\nname = "रोहन" // कंपाइल करने पर एरर! Val cannot be reassigned\n\nलेकिन एक अहम बात: val सिर्फ यह गारंटी देता है कि रेफरेंस नहीं बदलेगा, लेकिन ऑब्जेक्ट की अंदरूनी स्थिति बदल सकती है। अगर आप val का उपयोग mutableList के साथ करते हैं, तो आप अब भी एलिमेंट जोड़ और हटा सकते हैं।
val numbers = mutableListOf(1, 2, 3)\nnumbers.add(4) // यह काम करेगा!\n// numbers = mutableListOf(5, 6) // एरर! रेफरेंस को रीअसाइन नहीं कर सकते\n\nval को डिक्लेरेशन के समय या बाद में कोड में (जैसे कंस्ट्रक्टर या init ब्लॉक में) इनिशियलाइज़ किया जा सकता है। इसका मान प्रोग्राम रनटाइम के दौरान कैलकुलेट होता है।
const क्या है? कंपाइल टाइम का सख्त संरक्षक
\n\nconst, val का अधिक सख्त भाई है। यह भी अपरिवर्तनीय है, लेकिन इसमें एक खास क्षमता है: इसका मान कंपाइल टाइम पर ही पता होना चाहिए। दूसरे शब्दों में, यह एक असली कॉन्स्टेंट है जिसे कंपाइलर सीधे कोड में इनलाइन कर सकता है।
const के सख्त नियम हैं:
- \n
- इसे केवल फ़ाइल लेवल पर (क्लास के बाहर) या
object/companion objectके अंदर डिक्लेयर किया जा सकता है। \n - यह प्रिमिटिव टाइप या
Stringटाइप का होना चाहिए। \n - यह किसी फंक्शन कॉल या कैलकुलेशन का रिजल्ट नहीं हो सकता - केवल लिटरल या दूसरा कॉन्स्टेंट हो सकता है। \n
// सही\nconst val PI = 3.14159\nconst val APP_NAME = "MyApp"\n\n// गलत\nconst val currentTime = System.currentTimeMillis() // एरर! कंपाइल टाइम पर मान ज्ञात नहीं\nconst val userName = getName() // एरर! फंक्शन कॉल की अनुमति नहीं\n\nमुख्य अंतर: const vs val तालिका में
\n\nस्पष्टता के लिए, यहाँ एक तुलनात्मक तालिका है:
\n\n| मापदंड | \nconst val | \nval | \n
|---|---|---|
| इनिशियलाइज़ेशन का समय | \nकंपाइल टाइम पर | \nरनटाइम पर | \n
| कहाँ डिक्लेयर कर सकते हैं | \nटॉप-लेवल, object, companion object | \nकहीं भी (क्लास, फंक्शन, कंस्ट्रक्टर के अंदर) | \n
| डेटा टाइप | \nकेवल प्रिमिटिव और String | \nकोई भी टाइप (ऑब्जेक्ट, लिस्ट सहित) | \n
| परफॉरमेंस | \nअधिकतम (इनलाइनिंग) | \nसामान्य | \n
| एनोटेशन में उपयोग | \nहाँ | \nनहीं | \n
प्रैक्टिकल उदाहरण: एनोटेशन और परफॉरमेंस
\n\nसबसे महत्वपूर्ण उपयोगों में से एक