परिचय
Kotlin में `val` और `const val` दोनों अपरिवर्तनीय (read-only) गुण घोषित करते हैं, लेकिन उनके इनिशियलाइज़ेशन समय और उपयोग प्रतिबंधों में महत्वपूर्ण अंतर हैं।
const कीवर्ड
`const` का उपयोग कंपाइल-टाइम स्थिरांक के लिए किया जाता है। ये स्थिरांक क्लास फ़ाइल के बाइटकोड में एम्बेडेड होते हैं।
प्रतिबंध:
- केवल शीर्ष-स्तर या `companion object` / `object` घोषणा में सदस्य हो सकते हैं
- केवल प्रिमिटिव टाइप्स (Int, Long, Double, Boolean, String) के साथ
- कंपाइल-टाइम पर मान ज्ञात होना चाहिए (कोई फ़ंक्शन कॉल, कंस्ट्रक्टर नहीं)
- कस्टम गेटर/सेटर नहीं हो सकते
उदाहरण: const val
// शीर्ष-स्तरीय स्थिरांक
const val APP_NAME = "MyApp"
const val MAX_RETRY_COUNT = 3
const val API_BASE_URL = "https://api.example.com/"
// companion object में
class Config {
companion object {
const val DEFAULT_TIMEOUT = 5000L
const val VERSION_CODE = 1
}
}
fun main() {
println("ऐप: $APP_NAME")
println("अधिकतम पुनर्प्रयास: $MAX_RETRY_COUNT")
println("टाइमआउट: ${Config.DEFAULT_TIMEOUT}ms")
// const val को रनटाइम पर बदला नहीं जा सकता
// APP_NAME = "New" // कंपाइल त्रुटि
}
आउटपुट
ऐप: MyApp अधिकतम पुनर्प्रयास: 3 टाइमआउट: 5000ms
Val कीवर्ड
`val` रनटाइम पर इनिशियलाइज़ होने वाले रीड-ओनली गुण के लिए है।
विशेषताएं:
- रनटाइम पर इनिशियलाइज़ होता है
- किसी भी टाइप का हो सकता है (ऑब्जेक्ट्स, लिस्ट्स, फ़ंक्शन परिणाम)
- कस्टम गेटर हो सकते हैं
- क्लास प्रॉपर्टी, लोकल वेरिएबल, पैरामीटर के रूप में उपयोग किया जा सकता है
उदाहरण: val (रनटाइम इनिशियलाइज़ेशन)
fun main() {
// रनटाइम पर गणना
val currentTime = System.currentTimeMillis()
val randomValue = (0..100).random()
val userInput = readlnOrNull() ?: "डिफ़ॉल्ट"
// फ़ंक्शन कॉल परिणाम
val formattedDate = formatDate(currentTime)
// ऑब्जेक्ट इंस्टेंस
val user = User("John", 30)
println("समय: $currentTime")
println("यादृच्छिक: $randomValue")
println("उपयोगकर्ता: $user")
}
fun formatDate(timestamp: Long): String = "फॉर्मेटेड: $timestamp"
data class User(val name: String, val age: Int)
मुख्य अंतर तालिका
| पहलू | const val | val |
|---|---|---|
| इनिशियलाइज़ेशन समय | कंपाइल-टाइम | रनटाइम |
| अनुमत टाइप्स | केवल प्रिमिटिव + String | कोई भी टाइप |
| फ़ंक्शन कॉल अनुमत | नहीं | हाँ |
| कहाँ घोषित किया जा सकता है | शीर्ष-स्तर, object, companion object | कहीं भी (क्लास, फंक्शन, शीर्ष-स्तर) |
| बाइटकोड प्रतिनिधित्व | फील्ड + स्थिरांक मान एम्बेडेड | फील्ड + गेटर |
| एनोटेशन में उपयोग | हाँ (एनोटेशन पैरामीटर के रूप में) | नहीं |
उदाहरण: एनोटेशन में उपयोग
const val API_VERSION = "v1"
@Deprecated("Use $API_VERSION instead", ReplaceWith("newApi()"))
fun oldApi() {}
@Target(AnnotationTarget.FUNCTION)
annotation class MyAnnotation(val version: String)
// यह काम करता है - const val
@MyAnnotation(API_VERSION)
fun newApi() {}
// यह काम नहीं करेगा - val रनटाइम है
// val runtimeVersion = "v1"
// @MyAnnotation(runtimeVersion) // कंपाइल त्रुटि
fun anotherApi() {}
कब क्या उपयोग करें?
- const val: वास्तविक स्थिरांक के लिए - API कुंजी, कॉन्फ़िगरेशन मान, डेटाबेस कॉलम नाम, एनोटेशन मान
- val: बाकी सबके लिए - गणना किए गए मान, ऑब्जेक्ट्स, रनटाइम पर निर्धारित मान
सारांश
const val = कंपाइल-टाइम स्थिरांक (प्रिमिटिव/स्ट्रिंग केवल), val = रनटाइम रीड-ओनली (कोई भी टाइप)। जब संभव हो तो `const val` का उपयोग करें प्रदर्शन और एनोटेशन संगतता के लिए।