Kotlin में Constants: अब अनुमान न लगाएं, सही तरीका अपनाएं
\n\nअगर आप Kotlin में कम से कम एक हफ्ते से कोड लिख रहे हैं, तो आपने शायद यह सवाल पूछा होगा: "कॉन्स्टेंट को सही तरीके से कैसे डिक्लेयर करें?" लगता है सब कुछ आसान है — val है, const val है, companion object है। लेकिन असल में, बारीकियों में ही फर्क छिपा है। Stack Overflow पर इस सवाल के हज़ारों व्यूज़ हैं, और यह कोई संयोग नहीं है।
चलिए, एक बार और हमेशा के लिए समझ लेते हैं कि Kotlin में कॉन्स्टेंट बनाने के कौन से तरीके हैं, कब किसका उपयोग करना चाहिए, और क्यों val हमेशा कॉन्स्टेंट नहीं होता। शुरू करते हैं!
1. val vs const val: असल अंतर क्या है?
\n\nशुरुआती लोगों का सबसे आम सवाल: "मैंने val लिखा — क्या यह कॉन्स्टेंट है?" जवाब: हाँ और नहीं दोनों।
val एक अपरिवर्तनीय रेफरेंस (read-only) है। लेकिन इसकी वैल्यू रनटाइम पर कैलकुलेट होती है। यानी यह कम्पाइल-टाइम कॉन्स्टेंट नहीं है।
// यह कम्पाइल-टाइम कॉन्स्टेंट नहीं है\nval currentTime = System.currentTimeMillis()\n\nconst val एक असली कॉन्स्टेंट है, जो कम्पाइल होने पर सीधे कोड में एम्बेड हो जाता है (Java के static final की तरह)।
// और यह है असली कॉन्स्टेंट\nconst val PI = 3.14159\n\nमहत्वपूर्ण सीमा: const val का उपयोग केवल प्रिमिटिव टाइप और String के साथ ही किया जा सकता है। ऑब्जेक्ट, लिस्ट या कस्टम क्लास के साथ नहीं।
💡 सुनहरा नियम: अगर वैल्यू कम्पाइल-टाइम पर पता है — const val का उपयोग करें। अगर रनटाइम पर कैलकुलेट होती है — val का उपयोग करें।
2. कॉन्स्टेंट कहाँ डिक्लेयर करें? टॉप-3 तरीके
\n\nतरीका 1: Top-level कॉन्स्टेंट (सुझाया गया)
\n\nसबसे आसान और साफ तरीका — फ़ाइल के टॉप-लेवल पर कॉन्स्टेंट डिक्लेयर करना। कोई क्लास नहीं, कोई ऑब्जेक्ट नहीं — बस एक फ़ाइल जिसमें कॉन्स्टेंट हों।
\n\n// Constants.kt\nconst val BASE_URL = "https://api.example.com"\nconst val TIMEOUT_SECONDS = 30\nconst val APP_NAME = "MyKotlinApp"\n\nयह क्यों बढ़िया है?
\n- \n
- कम से कम कोड \n
- बिना प्रीफिक्स के हर जगह उपलब्ध \n
- कम्पाइलर वैल्यू को एम्बेड करता है \n
- रीफैक्टर करना आसान \n
तरीका 2: क्लास के अंदर companion object
\n\nJava का क्लासिक तरीका, जो Kotlin में आया है। जब कॉन्स्टेंट किसी क्लास से तार्किक रूप से जुड़े हों, तब इसका उपयोग करें।
\n\nclass NetworkClient {\n companion object {\n const val DEFAULT_PORT = 8080\n const val PROTOCOL = "https"\n }\n}\n\n// उपयोग\nval port = NetworkClient.DEFAULT_PORT\n\nनुकसान: सिंटैक्स में अतिरिक्त शोर। फायदा: कॉन्स्टेंट कॉन्टेक्स्ट से बंधे होते हैं।
\n\nतरीका 3: object (सिंगलटन) कॉन्स्टेंट के समूह के लिए
\n\nजब बहुत सारे कॉन्स्टेंट हों और उन्हें अर्थ के अनुसार समूहित करना हो।
\n\nobject AppConstants {\n const val MAX_LOGIN_ATTEMPTS = 5\n const val SESSION_DURATION = 3600L\n const val DATE_FORMAT = "yyyy-MM-dd"\n\n object Urls {\n const val LOGIN = "/auth/login"\n const val LOGOUT = "/auth/logout"\n }\n}\n\n// उपयोग\nAppConstants.Urls.LOGIN\n\n3. Android में कॉन्स्टेंट: खास बातें
\n\nअगर आप Android के लिए कोड लिख रहे हैं, तो कुछ अतिरिक्त बारीकियाँ हैं।
\n\ncompanion object में कॉन्स्टेंट और @JvmStatic
\n\ncompanion object के कॉन्स्टेंट को Java में असली स्टैटिक बनाने के लिए (जैसे एनोटेशन के लिए), @JvmStatic का उपयोग करें:
class MyFragment : Fragment() {\n companion object {\n @JvmStatic\n const val ARG_ID = "id"\n }\n}\n\nरिसोर्सेज़ में कॉन्स्टेंट
\n\nAndroid का क्लासिक तरीका न भूलें — रिसोर्सेज़। स्ट्रिंग, रंग, साइज़ के लिए:
\n\n// strings.xml\n<string name="app_name">MyApp</string>\n\n// कोड में\nval appName = getString(R.string.app_name)\n\nलेकिन ये कम्पाइल-टाइम कॉन्स्टेंट नहीं हैं।