Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler
Temsilcileri SharedPreferences, Map depolama alanı ve denetim günlüklemesine uygulayın.
Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Eşleme Destekli Özellikler
Kotlin, özellikleri doğrudan bir Map'e delege etmenize olanak tanır. Özelliğin okunması, eşleme içinde adının aranmasını sağlar.
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 Delegate Kalıbı
Değiştirilebilir özellikler için bir MutableMap'e delege edin; yapılan değişiklikler temel eşlemeyi günceller.
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
}Eşleme Delegate ile JSON Serileştirmesini Çözme
JSON benzeri bir eşlemeyi ayrıştırın ve alanlarını eşleme delegasyonu kullanarak türü belirli özellikler olarak sunun — dinamik veriler için idealdir.
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
}Günlükleme için Delegate Kalıbı
Her delege edilmiş özellikteki tüm okuma ve yazma işlemlerini şeffaf biçimde izlemek için herhangi bir delegeyi günlükleme ile sarmalayın.
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" }Eşleme + Günlüklemeyi Birleştirme
Dinamik özellik erişimini eksiksiz biçimde denetlenebilir kılmak için eşleme delegasyonunun çevresine bir günlükleme sarmalayıcısı katmanı ekleyin.
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 Tarzı Delegate
Değerleri SharedPreferences'ı taklit eden temel bir eşlemede depolayan bir delege kullanın — eşlemeyi gerçek tercihler çağrılarıyla değiştirerek gerçek Android tercihlerine uyarlayabilirsiniz.
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
}Türü Belirli Tercih Yardımcıları
Daha temiz çağrı noktaları için her ilkel tercih türüne yönelik türü belirli yardımcı işlevler oluşturun.
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}") }Denetim Günlüğü Delegate
Uyumluluk veya hata ayıklama senaryoları için her özellik değişikliğini zaman damgasıyla birlikte bir denetim listesine kaydedin.
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)
}Doğrulama + Eşleme Depolaması
Eşleme depolamasını doğrulamayla birleştirin: Geçersiz değerleri eşlemeye yazmadan önce reddedin.
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) }
}Delegate Birleştirme Kalıbı
Bir oluşturucu tarzı API kullanarak birden çok delege davranışını birleştirin: Temel bir delegeyle başlayıp günlükleme, doğrulama veya önbelleğe alma katmanları ekleyin.
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)
}
}
}Gerçek Dünya: Yapılandırma Nesnesi Kalıbı
Ortam değişkenleri veya bir JSON yapılandırma dosyası gibi harici kaynaklardan bir yapılandırma nesnesi oluşturmak için eşleme delegasyonunu kullanın.
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}")
}Kısa Kontrol
Bir özelliği bir Map'e delege ettiğinizde ne olur?
Özet
Delegeler güçlü kalıpların önünü açar: Dinamik/JSON verileri için eşleme delegasyonu, SharedPreferences tarzı kalıcılık, uyumluluk için denetim günlüğü ve birleştirilebilir doğrulama — bunların tümü çağrı noktalarını değiştirmeden kullanılabilir.
Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 51
- Dersler
- 203
Sıkça Sorulan Sorular
“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersi ücretsiz mi?
Evet — “Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersinde ne öğreneceğim?
Temsilcileri SharedPreferences, Map depolama alanı ve denetim günlüklemesine uygulayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- by lazy: Ertelenmiş Başlatmaya Derinlemesine Bakış
- observable ve vetoable Temsilcileri
- Özel ReadWriteProperty Temsilcisi Yazma
- Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler