परिचय
Kotlin में चर घोषित करने के लिए दो कीवर्ड हैं: var (परिवर्तनीय) और val (अपरिवर्तनीय)। यह अंतर सुरक्षित और पूर्वानुमेय कोड लिखने के लिए मौलिक है।
तुलना तालिका
| विशेषता | var | val |
|---|---|---|
| परिवर्तनीयता | परिवर्तनीय (Mutable) | अपरिवर्तनीय (Immutable) |
| पुनः असाइनमेंट | अनुमत | अनुमत नहीं |
| जावा समकक्ष | सामान्य चर | final चर |
| डिफ़ॉल्ट पसंद | जब परिवर्तन आवश्यक हो | डिफ़ॉल्ट रूप से प्राथमिकता दें |
उदाहरण 1: var - परिवर्तनीय चर
fun main() {
var mutableName = "Kotlin"
println("प्रारंभिक: $mutableName")
// पुनः असाइनमेंट अनुमत है
mutableName = "Kotlin Programming"
println("बदला गया: $mutableName")
// एकाधिक बार बदला जा सकता है
mutableName = "Android Development"
println("फिर बदला गया: $mutableName")
}
आउटपुट
प्रारंभिक: Kotlin बदला गया: Kotlin Programming फिर बदला गया: Android Development
उदाहरण 2: val - अपरिवर्तनीय चर
fun main() {
val immutableName = "TutorialsPoint"
println("मान: $immutableName")
// यह कंपाइल त्रुटि देगा:
// immutableName = "New Value" // Error: Val cannot be reassigned
}
कंपाइल त्रुटि
Error: Val cannot be reassigned
महत्वपूर्ण अंतर: val ऑब्जेक्ट को अपरिवर्तनीय नहीं बनाता
fun main() {
// val रेफरेंस अपरिवर्तनीय है, लेकिन ऑब्जेक्ट परिवर्तनीय हो सकता है
val mutableList = mutableListOf("A", "B")
println("पहले: $mutableList")
// यह अनुमत है - लिस्ट की सामग्री बदल रही है, रेफरेंस नहीं
mutableList.add("C")
println("बाद में: $mutableList")
// लेकिन यह अनुमत नहीं है:
// mutableList = mutableListOf("D") // Error: Val cannot be reassigned
}
सर्वोत्तम अभ्यास
- डिफ़ॉल्ट रूप से val का उपयोग करें - अपरिवर्तनीयता बग कम करती है और कोड को तर्कसंगत बनाना आसान बनाती है
- केवल var का उपयोग करें जब आवश्यक हो - जब आपको वास्तव में रेफरेंस बदलने की आवश्यकता हो
- संग्रह के लिए: `val list = mutableListOf()` पसंद करें `var list = mutableListOf()` पर
- फंक्शनल शैली: `var` के बजाय परिवर्तन के बजाय रूपांतरण (`map`, `filter`) का उपयोग करें
उन्नत: lateinit और lazy के साथ
// lateinit - केवल var के साथ (बाद में इनिशियलाइज़ेशन)
class Example {
lateinit var name: String // non-null, बाद में इनिशियलाइज़ होगा
// lazy - केवल val के साथ (थ्रेड-सेफ लेज़ी इनिशियलाइज़ेशन)
val expensiveComputation: String by lazy {
println("कंप्यूटिंग...")
"परिणाम"
}
}
निष्कर्ष
val डिफ़ॉल्ट विकल्प होना चाहिए। यह अपरिवर्तनीयता को लागू करता है, जिससे कोड अधिक सुरक्षित, थ्रेड-सेफ और समझने में आसान बनता है। केवल var का उपयोग करें जब आपके पास पुनः असाइनमेंट के लिए स्पष्ट कारण हो।