0Pricing
Kotlin Academy · Ders

Özel ReadWriteProperty Temsilcisi Yazma

ReadWriteProperty kullanarak sıfırdan özel bir özellik temsilcisi uygulayın.

Özel ReadWriteProperty Temsilcisi Yazma, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. 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.

ReadWriteProperty Arayüzü

Özel bir temsilci, getValue ve setValue işleçleriyle ReadWriteProperty<ThisRef, T> uygular.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class SimpleDelegate<T>(private var value: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(thisRef: Any?, property: KProperty<*>): T = value
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        this.value = value
    }
}
var x: Int by SimpleDelegate(0)
fun main() { x = 42; println(x) }

val için ReadOnlyProperty

Salt okunur val özellikleri için yalnızca getValue ile ReadOnlyProperty<ThisRef, T> uygulayın.

import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class Constant<T>(private val value: T) : ReadOnlyProperty<Any?, T> {
    override fun getValue(thisRef: Any?, property: KProperty<*>): T = value
}
val pi: Double by Constant(3.14159)
fun main() { println(pi) }

Bağlam için thisRef Kullanma

thisRef, temsilcinin kapsayan nesneye erişmesini ve bağlama duyarlı davranış sergilemesini sağlar.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class LoggingDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        println("[${thisRef?.javaClass?.simpleName}] get ${property.name} = $v")
        return v
    }
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        println("[${thisRef?.javaClass?.simpleName}] set ${property.name} = $value")
        v = value
    }
}
class Config { var host: String by LoggingDelegate("localhost") }
fun main() { val c = Config(); c.host = "prod.example.com"; println(c.host) }

Sınırlandırılmış Sayısal Temsilci

Sayısal bir değeri bir aralıkla sınırlayan ve değişmezleri şeffaf biçimde zorunlu kılan bir temsilci.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class Clamped(private val min: Int, private val max: Int, initial: Int) : ReadWriteProperty<Any?, Int> {
    private var v = initial.coerceIn(min, max)
    override fun getValue(t: Any?, p: KProperty<*>) = v
    override fun setValue(t: Any?, p: KProperty<*>, value: Int) {
        v = value.coerceIn(min, max)
    }
}
var brightness: Int by Clamped(0, 255, 128)
fun main() {
    brightness = 300; println(brightness) // 255
    brightness = -5;  println(brightness) // 0
    brightness = 100; println(brightness) // 100
}

Boş Değer Alabilen Önbellek Temsilcisi

Bir değeri bir kez hesaplayıp önbelleğe alan ve null atanarak geçersiz kılınabilen bir temsilci.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class CachedNullable<T>(private val compute: () -> T) : ReadWriteProperty<Any?, T?> {
    private var cache: T? = null
    override fun getValue(t: Any?, p: KProperty<*>): T? = cache ?: compute().also { cache = it }
    override fun setValue(t: Any?, p: KProperty<*>, value: T?) { cache = value }
}
var expensiveResult: Int? by CachedNullable { (1..1000).sum() }
fun main() {
    println(expensiveResult) // computed
    println(expensiveResult) // cached
    expensiveResult = null
    println(expensiveResult) // recomputed
}

@Synchronized ile İş Parçacığı Güvenli Temsilci

@Synchronized veya dahili bir kilit nesnesiyle temsilciye iş parçacığı güvenliği ekleyin.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class SynchronizedDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    @Synchronized
    override fun getValue(t: Any?, p: KProperty<*>) = v
    @Synchronized
    override fun setValue(t: Any?, p: KProperty<*>, value: T) { v = value }
}
var counter: Int by SynchronizedDelegate(0)
fun main() { counter = 99; println(counter) }

Temsilci Fabrika İşlevi Kalıbı

Standart kitaplık tarzını izleyerek, temsilci nesnesini döndüren bir uzantı işlevi aracılığıyla temsilciyi kullanıma sunun.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
fun <T> logged(initial: T): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
    var v = initial
    override fun getValue(t: Any?, p: KProperty<*>): T { println("get ${p.name}"); return v }
    override fun setValue(t: Any?, p: KProperty<*>, value: T) { println("set ${p.name}=$value"); v = value }
}
var name: String by logged("world")
fun main() { println(name); name = "Kotlin" }

KProperty Meta Verileri ile Temsilci

KProperty bağımsız değişkeni, özellik adını ve ek açıklamaları sağlar; günlük kaydı çerçeveleri veya ORM'ler için kullanışlıdır.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class AuditDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    private val history = mutableListOf<String>()
    override fun getValue(t: Any?, p: KProperty<*>) = v
    override fun setValue(t: Any?, p: KProperty<*>, value: T) {
        history.add("${p.name}: $v -> $value")
        v = value
    }
    fun printHistory() = history.forEach(::println)
}
var status: String by AuditDelegate("idle").also { /* expose audit */ }

provideDelegate İşleci

provideDelegate, bir temsilcinin temsilci atamasının kurulmasına müdahale etmesini ve başlatma sırasında özellik adını veya ek açıklamaları doğrulamasını sağlar.

import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class ValidatedDelegate<T>(private val v: T) {
    operator fun provideDelegate(t: Any?, p: KProperty<*>): ReadOnlyProperty<Any?, T> {
        require(p.name.isNotBlank()) { "Property name must not be blank" }
        return ReadOnlyProperty { _, _ -> v }
    }
}
val greeting: String by ValidatedDelegate("Hello")
fun main() { println(greeting) }

Yaklaşımları Karşılaştırma

Özel temsilciler ile observable/vetoable karşılaştırması: basit tepkisel kalıplar için yerleşik temsilcileri kullanın; karmaşık değişmezler, önbelleğe alma veya bağlama duyarlı davranışlar için özel temsilciler yazın.

// Built-in: simple change notification
import kotlin.properties.Delegates
var simple: Int by Delegates.observable(0) { _,_,v -> println("changed: $v") }
// Custom: clamping + logging
var complex: Int by run {
    object : kotlin.properties.ReadWriteProperty<Any?,Int> {
        var v = 0
        override fun getValue(t:Any?,p:kotlin.reflect.KProperty<*>)=v
        override fun setValue(t:Any?,p:kotlin.reflect.KProperty<*>,value:Int){
            println("clamping $value"); v=value.coerceIn(0,100)
        }
    }
}
fun main() { simple=5; complex=200; println(complex) }

Uygulama: SharedPreferences Delegate

Yaygın bir Android kalıbı: Bir özelliği SharedPreferences kullanarak delege edin; böylece okuma ve yazma işlemleri şeffaf biçimde diske kalıcı olarak kaydedilir.

// Pseudocode (no Android runtime here)
class PrefDelegate(private val key: String, private val default: String) {
    // In real Android code:
    // override fun getValue(...) = prefs.getString(key, default) ?: default
    // override fun setValue(...) { prefs.edit().putString(key, value).apply() }
    fun getValue(): String = default // simplified
}
fun main() {
    val delegate = PrefDelegate("user_name", "Guest")
    println(delegate.getValue())
}

Kısa Kontrol

Okuma-yazma temsilcisi hangi arayüzü uygulamalıdır?

Özet

Özel delegeler ReadWriteProperty (veya ReadOnlyProperty) uygular ve günlükleme, önbelleğe alma, doğrulama, sınırlandırma veya platform depolaması gibi işlemleri şeffaf bir özellik arayüzünün arkasında kapsülleyebilir.

Sıkça Sorulan Sorular

“Özel ReadWriteProperty Temsilcisi Yazma” dersi ücretsiz mi?

Evet — “Özel ReadWriteProperty Temsilcisi Yazma” 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.

“Özel ReadWriteProperty Temsilcisi Yazma” dersinde ne öğreneceğim?

ReadWriteProperty kullanarak sıfırdan özel bir özellik temsilcisi 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 3. dersidir.

“Özel ReadWriteProperty Temsilcisi Yazma” 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

  1. by lazy: Ertelenmiş Başlatmaya Derinlemesine Bakış
  2. observable ve vetoable Temsilcileri
  3. Özel ReadWriteProperty Temsilcisi Yazma
  4. Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler
← Kotlin Academy Sayfasına Dön