परिचय: एक छोटा सा ऑपरेटर, बड़ा जादू
\n\nक्या आपने कभी किसी और का Kotlin कोड देखा है और उसमें val name by lazy { ... } या class Derived(Base by impl) जैसी अजीब संरचना देखी है? अगर हाँ, तो आपने ज़रूर सोचा होगा: «Kotlin में by कीवर्ड क्या करता है?»। यह सवाल Stack Overflow पर सबसे लोकप्रिय सवालों में से एक है, और यह सही भी है। by सिर्फ एक सिंटैक्स शुगर नहीं है, बल्कि डेलिगेशन का एक शक्तिशाली तंत्र है जो आपके कोड को बहुत सरल, साफ और बॉयलरप्लेट कोड से मुक्त बना सकता है।
इस लेख में हम by को पूरी तरह से समझेंगे। आप जानेंगे कि प्रॉपर्टी डेलिगेशन और क्लास डेलिगेशन कैसे काम करते हैं। हम शुरुआती लोगों के सबसे आम सवालों के जवाब देंगे और वास्तविक उदाहरण दिखाएंगे जिन्हें आप तुरंत अपने प्रोजेक्ट्स में इस्तेमाल कर सकते हैं। चलिए शुरू करते हैं!
Kotlin में डेलिगेशन क्या है? (मुख्य विचार)
\n\nविस्तार में जाने से पहले, आइए मूल बात समझें। डेलिगेशन एक डिज़ाइन पैटर्न है जिसमें एक ऑब्जेक्ट अपने काम को दूसरे ऑब्जेक्ट (हेल्पर) को सौंप देता है। Kotlin ने इस पैटर्न को by कीवर्ड के साथ सीधे भाषा में शामिल कर दिया है। 'हाथ से' कोड लिखने के बजाय, आप कंपाइलर से कहते हैं: "अरे, यह काम इस चीज़ को करने दे"।
Kotlin में डेलिगेशन के दो मुख्य प्रकार हैं:
\n- \n
- प्रॉपर्टी डेलिगेशन — जब प्रॉपर्टी के getter/setter को किसी दूसरे ऑब्जेक्ट को सौंप दिया जाता है। \n
- क्लास डेलिगेशन — जब इंटरफ़ेस के कार्यान्वयन को किसी दूसरे ऑब्जेक्ट को सौंप दिया जाता है। \n
दोनों विकल्प एक ही कीवर्ड — by का उपयोग करते हैं। आइए प्रत्येक को समझें।
1. प्रॉपर्टी डेलिगेशन: फ़ील्ड के लिए by
\n\nयह by का सबसे लोकप्रिय उपयोग है। यह प्रॉपर्टी के getter और setter के लिए लॉजिक को पुनः उपयोग करने की अनुमति देता है। हर बार एक जैसा कोड लिखने के बजाय, आप तैयार या अपने खुद के डेलिगेट का उपयोग करते हैं।
उदाहरण 1: by lazy — आलसी इनिशियलाइज़ेशन
\n\nकल्पना करें कि आपके पास एक प्रॉपर्टी है जो बनने में समय लेती है (जैसे, नेटवर्क से डेटा लोड करना)। आप इसे क्लास बनाते समय नहीं, बल्कि पहली बार एक्सेस करने पर कैलकुलेट करना चाहते हैं। by lazy बिल्कुल यही करता है:
val heavyData: String by lazy {\n println("डेटा कैलकुलेट कर रहा हूँ...")\n "बहुत भारी परिणाम"\n}\n\nfun main() {\n println("शुरू")\n println(heavyData) // पहली कॉल: कैलकुलेट करें\n println(heavyData) // दूसरी कॉल: कैश से लें\n}\n\nआउटपुट:
\nशुरू\nडेटा कैलकुलेट कर रहा हूँ...\nबहुत भारी परिणाम\nबहुत भारी परिणाम\n\nयहाँ क्या हुआ? by कीवर्ड कहता है: «प्रॉपर्टी heavyData अपना कार्यान्वयन lazy { ... } ऑब्जेक्ट को सौंपती है»। यह ऑब्जेक्ट गारंटी देता है कि कोड ब्लॉक केवल एक बार, पहली बार एक्सेस करने पर चलेगा, और फिर परिणाम को सेव कर लेगा। यह कॉन्फ़िगरेशन, DB कनेक्शन और अन्य 'महंगे' ऑब्जेक्ट्स के लिए एकदम सही है।
उदाहरण 2: by observable — बदलावों पर नज़र रखना
\n\nक्या आप हर बार जब प्रॉपर्टी बदले तो कोई कार्रवाई करना चाहते हैं? स्टैंडर्ड लाइब्रेरी से Delegates.observable का उपयोग करें:
import kotlin.properties.Delegates\n\nvar watchedValue: Int by Delegates.observable(0) { property, oldValue, newValue ->\n println("पुराना: $oldValue, नया: $newValue")\n}\n\nfun main() {\n watchedValue = 10 // पुराना: 0, नया: 10\n watchedValue = 42 // पुराना: 10, नया: 42\n}\n\nयह पैटर्न रिएक्टिव प्रोग्रामिंग, डेटा वैलिडेशन या UI सिंक्रोनाइज़ेशन के लिए अपरिहार्य है। यहाँ भी by उसी तरह काम करता है।