Preferences, Map-Backed Properties और Logging के लिए Delegates
SharedPreferences, Map storage और audit logging पर delegates लागू करें।
Preferences, Map-Backed Properties और Logging के लिए Delegates, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
मैप-आधारित प्रॉपर्टीज़
Kotlin प्रॉपर्टीज़ का डेलीगेशन सीधे Map को कर सकता है। प्रॉपर्टी को पढ़ने पर मैप में उसके नाम की खोज की जाती है।
class User(map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
fun main() {
val u = User(mapOf("name" to "Alice", "age" to 30))
println(u.name) // Alice
println(u.age) // 30
}MutableMap डेलीगेट
परिवर्तनीय प्रॉपर्टीज़ के लिए MutableMap को डेलीगेट करें; तब किए गए परिवर्तन आधारभूत मैप को अपडेट करते हैं।
class Settings(private val map: MutableMap<String, Any?> = mutableMapOf()) {
var theme: String by map
var fontSize: Int by map
}
fun main() {
val s = Settings()
s.theme = "dark"
s.fontSize = 16
println(s.theme) // dark
println(s.fontSize) // 16
}मैप डेलीगेट के साथ JSON डीसीरियलाइज़ेशन
JSON-जैसे मैप को पार्स करें और मैप डेलीगेशन का उपयोग करके उसके फ़ील्ड को प्रकार-युक्त प्रॉपर्टीज़ के रूप में उपलब्ध कराएँ—गतिशील डेटा के लिए यह बहुत उपयोगी है।
class ApiResponse(data: Map<String, Any?>) {
val id: Int by data
val title: String by data
val published: Boolean by data
}
fun main() {
val response = ApiResponse(mapOf("id" to 1, "title" to "Kotlin Rocks", "published" to true))
println(response.title) // Kotlin Rocks
println(response.published) // true
}लॉग दर्ज करने वाले डेलीगेट का पैटर्न
हर डेलीगेट को लॉग दर्ज करने की सुविधा से लपेटें, ताकि सभी डेलीगेट की गई प्रॉपर्टीज़ में प्रत्येक पढ़ने और लिखने की क्रिया का पारदर्शी रूप से पता लगाया जा सके।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class Logged<T>(private var v: T) : ReadWriteProperty<Any?, T> {
override fun getValue(t: Any?, p: KProperty<*>): T {
println("[READ] ${p.name} = $v"); return v
}
override fun setValue(t: Any?, p: KProperty<*>, value: T) {
println("[WRITE] ${p.name}: $v -> $value"); v = value
}
}
var config: String by Logged("default")
fun main() { println(config); config = "production" }मैप और लॉग दर्ज करना साथ में
गतिशील प्रॉपर्टी एक्सेस का पूरा ऑडिट रिकॉर्ड रखने के लिए मैप डेलीगेशन के चारों ओर लॉग दर्ज करने वाला आवरण लगाएँ।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class TrackedMap(private val map: MutableMap<String,Any?> = mutableMapOf()) {
inner class Delegate<T> : ReadWriteProperty<Any?,T> {
@Suppress("UNCHECKED_CAST")
override fun getValue(t:Any?,p:KProperty<*>): T {
val v = map[p.name] as T; println("read ${p.name}=$v"); return v
}
override fun setValue(t:Any?,p:KProperty<*>,value:T) {
println("write ${p.name}=$value"); map[p.name]=value
}
}
var host: String by Delegate()
}
fun main() { val m=TrackedMap(); m.host="localhost"; println(m.host) }SharedPreferences-शैली डेलीगेट
यह डेलीगेट SharedPreferences का अनुकरण करते हुए मानों को आधारभूत मैप में रखता है—वास्तविक Android प्राथमिकताओं के लिए मैप की जगह वास्तविक प्राथमिकता कॉल कर दें।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val prefs = mutableMapOf<String, Any?>()
fun <T> pref(default: T): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
@Suppress("UNCHECKED_CAST")
override fun getValue(t: Any?, p: KProperty<*>): T = prefs.getOrDefault(p.name, default) as T
override fun setValue(t: Any?, p: KProperty<*>, value: T) { prefs[p.name] = value }
}
object UserPrefs {
var username: String by pref("Guest")
var isDarkMode: Boolean by pref(false)
}
fun main() {
println(UserPrefs.username) // Guest
UserPrefs.username = "Alice"
println(UserPrefs.username) // Alice
}प्रकार-युक्त प्राथमिकता सहायक
कॉल करने वाले स्थानों को अधिक साफ़ रखने के लिए प्रत्येक आदिम प्राथमिकता प्रकार हेतु प्रकार-युक्त सहायक फ़ंक्शन बनाएँ।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val store = mutableMapOf<String,Any?>()
fun stringPref(default: String) = object : ReadWriteProperty<Any?,String> {
@Suppress("UNCHECKED_CAST")
override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as String
override fun setValue(t:Any?,p:KProperty<*>,v:String) { store[p.name]=v }
}
fun intPref(default: Int) = object : ReadWriteProperty<Any?,Int> {
@Suppress("UNCHECKED_CAST")
override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as Int
override fun setValue(t:Any?,p:KProperty<*>,v:Int) { store[p.name]=v }
}
object Prefs {
var name: String by stringPref("default")
var count: Int by intPref(0)
}
fun main() { Prefs.name="Bob"; Prefs.count=5; println("${Prefs.name}: ${Prefs.count}") }ऑडिट लॉग डेलीगेट
हर प्रॉपर्टी परिवर्तन को समय-मुहर के साथ ऑडिट सूची में दर्ज करें—यह अनुपालन या डीबगिंग वाले परिदृश्यों के लिए आदर्श है।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val audit = mutableListOf<String>()
class AuditDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
override fun getValue(t:Any?,p:KProperty<*>) = v
override fun setValue(t:Any?,p:KProperty<*>,value:T) {
audit += "[${System.currentTimeMillis()}] ${p.name}: $v -> $value"
v = value
}
}
var price: Double by AuditDelegate(9.99)
fun main() {
price = 12.99
price = 11.49
audit.forEach(::println)
}मान्यकरण और मैप भंडारण
मैप भंडारण को मान्यकरण के साथ जोड़ें: अमान्य मानों को मैप में लिखने से पहले अस्वीकार करें।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val data = mutableMapOf<String, Any?>()
fun positiveInt(default: Int): ReadWriteProperty<Any?,Int> = object : ReadWriteProperty<Any?,Int> {
@Suppress("UNCHECKED_CAST")
override fun getValue(t:Any?,p:KProperty<*>)=data.getOrDefault(p.name,default) as Int
override fun setValue(t:Any?,p:KProperty<*>,v:Int){
require(v>=0){"${p.name} must be >= 0"}
data[p.name]=v
}
}
object Inventory { var stock: Int by positiveInt(100) }
fun main(){
Inventory.stock=50; println(Inventory.stock)
try { Inventory.stock=-1 } catch(e:Exception){ println(e.message) }
}डेलीगेट संयोजन का पैटर्न
बिल्डर-शैली इंटरफ़ेस का उपयोग करके कई डेलीगेट व्यवहारों को संयोजित करें: आधार डेलीगेट से शुरू करें और उसमें लॉग दर्ज करना, मान्यकरण या कैश रखना जैसी परतें जोड़ें।
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
fun <T> ReadWriteProperty<Any?,T>.withLogging(): ReadWriteProperty<Any?,T> {
val base = this
return object : ReadWriteProperty<Any?,T> {
override fun getValue(t:Any?,p:KProperty<*>): T {
val v = base.getValue(t,p); println("get ${p.name}=$v"); return v
}
override fun setValue(t:Any?,p:KProperty<*>,v:T){
println("set ${p.name}=$v"); base.setValue(t,p,v)
}
}
}वास्तविक उपयोग: कॉन्फ़िगरेशन ऑब्जेक्ट पैटर्न
पर्यावरण चर या JSON कॉन्फ़िगरेशन फ़ाइल जैसे बाहरी स्रोतों से कॉन्फ़िगरेशन ऑब्जेक्ट बनाने के लिए मैप डेलीगेशन का उपयोग करें।
class AppConfig(private val raw: Map<String, Any?>) {
val host: String by raw
val port: Int by raw
val debug: Boolean by raw
}
fun main() {
val env = mapOf("host" to "0.0.0.0", "port" to 8080, "debug" to true)
val cfg = AppConfig(env)
println("${cfg.host}:${cfg.port} debug=${cfg.debug}")
}त्वरित जाँच
जब किसी प्रॉपर्टी का डेलीगेशन Map को किया जाता है, तो क्या होता है?
पुनरावलोकन
डेलीगेट शक्तिशाली पैटर्न उपलब्ध कराते हैं: गतिशील या JSON डेटा के लिए मैप डेलीगेशन, स्थायी भंडारण के लिए SharedPreferences-शैली, अनुपालन के लिए ऑडिट लॉग और संयोज्य मान्यकरण—वह भी कॉल करने वाले स्थानों में बदलाव किए बिना।
एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “Preferences, Map-Backed Properties और Logging के लिए Delegates” पाठ निःशुल्क है?
हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Preferences, Map-Backed Properties और Logging के लिए Delegates” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Preferences, Map-Backed Properties और Logging के लिए Delegates” में मैं क्या सीखूँगा?
SharedPreferences, Map storage और audit logging पर delegates लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Preferences, Map-Backed Properties और Logging के लिए Delegates” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- by lazy: Deferred Initialization का गहन अध्ययन
- observable और vetoable Delegates
- कस्टम ReadWriteProperty Delegate लिखना
- Preferences, Map-Backed Properties और Logging के लिए Delegates