0Pricing
Kotlin Academy · Pelajaran

Delegasi observable dan vetoable

Tanggapi perubahan properti dengan observable dan tolak perubahan secara bersyarat dengan vetoable.

Delegasi observable dan vetoable adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Penyegaran Delegasi Properti

Delegasi properti Kotlin memungkinkan objek terpisah menangani getValue dan setValue. Delegates.observable dan Delegates.vetoable adalah delegasi bawaan dari pustaka standar.

import kotlin.properties.Delegates
var name: String by Delegates.observable("initial") { prop, old, new ->
    println("${prop.name}: $old -> $new")
}
fun main() { name = "Alice"; name = "Bob" }

Sintaks observable

observable menerima nilai awal dan fungsi panggilan balik yang dipanggil setelah setiap perubahan, dengan properti, nilai lama, dan nilai baru.

import kotlin.properties.Delegates
var score: Int by Delegates.observable(0) { _, old, new ->
    println("Score changed from $old to $new")
}
fun main() {
    score = 10
    score = 25
    score = 0
}

Memicu Pembaruan UI

Delegasi observable sangat baik untuk memicu penyegaran UI ketika properti pendukung berubah, tanpa penyiapan LiveData secara menyeluruh.

import kotlin.properties.Delegates
class ViewModel {
    var title: String by Delegates.observable("Loading") { _, _, new ->
        println("Render: $new") // pretend this updates UI
    }
}
fun main() {
    val vm = ViewModel()
    vm.title = "Home"
    vm.title = "Settings"
}

Sintaks vetoable

vetoable memanggil fungsi panggilan balik sebelum penetapan. Jika fungsi panggilan balik mengembalikan false, nilai baru ditolak dan nilai lama dipertahankan.

import kotlin.properties.Delegates
var age: Int by Delegates.vetoable(0) { _, old, new ->
    new >= 0 // reject negative ages
}
fun main() {
    age = 25; println(age)  // 25
    age = -1; println(age)  // 25 (rejected)
    age = 30; println(age)  // 30
}

Menggabungkan Validasi dengan vetoable

Gunakan vetoable untuk menegakkan invarian domain pada tingkat properti tanpa logika validasi eksternal.

import kotlin.properties.Delegates
var email: String by Delegates.vetoable("") { _, _, new ->
    new.contains("@")
}
fun main() {
    email = "user@example.com"; println(email) // set
    email = "invalid";          println(email) // still previous
}

Mencatat Perubahan dengan observable

Gunakan observable untuk pencatatan audit: catat setiap transisi keadaan secara otomatis tanpa menyentuh logika bisnis.

import kotlin.properties.Delegates
val log = mutableListOf<String>()
var status: String by Delegates.observable("IDLE") { _, old, new ->
    log.add("$old -> $new")
}
fun main() {
    status = "RUNNING"
    status = "DONE"
    println(log)
}

observable dalam Kelas

Kedua delegasi dapat digunakan di dalam isi kelas seperti properti lainnya.

import kotlin.properties.Delegates
class Counter {
    var count: Int by Delegates.observable(0) { _, old, new ->
        if (new > old) println("Incremented to $new")
        else println("Decremented to $new")
    }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 3
}

vetoable untuk Batas Rentang

Batasi properti numerik ke rentang yang valid menggunakan vetoable.

import kotlin.properties.Delegates
var volume: Int by Delegates.vetoable(50) { _, _, new ->
    new in 0..100
}
fun main() {
    volume = 80;  println(volume) // 80
    volume = 150; println(volume) // 80 (rejected)
    volume = 0;   println(volume) // 0
}

Merangkai Delegasi

Anda dapat menggabungkan logika observable secara manual dengan menulis delegasi khusus yang memanggil observable di balik layar dan menambahkan logika ekstra pada setiap langkah.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class LoggedDelegate<T>(initial: T) : ReadWriteProperty<Any?, T> {
    private var value: T = initial
    override fun getValue(t: Any?, p: KProperty<*>) = value
    override fun setValue(t: Any?, p: KProperty<*>, v: T) {
        println("Setting ${p.name} = $v"); value = v
    }
}
var x: Int by LoggedDelegate(0)
fun main() { x = 10; x = 20 }

Catatan Keamanan Utas

observable maupun vetoable tidak aman untuk digunakan oleh banyak utas secara bawaan. Untuk akses bersamaan, lindungi perubahan dengan mutex atau lakukan sinkronisasi secara eksternal.

import kotlin.properties.Delegates
// Not thread-safe as-is:
var sharedState: String by Delegates.observable("start") { _, old, new ->
    println("$old -> $new")
}
// In coroutines, wrap access with Mutex if needed

Pola Praktis: Validasi Formulir

Gunakan vetoable untuk setiap bidang sebagai validasi formulir deklaratif: setiap bidang memvalidasi dirinya sendiri saat ditetapkan.

import kotlin.properties.Delegates
data class Form(
    var username: String = "",
    var password: String = ""
) {
    var validUsername: String by Delegates.vetoable("") { _,_,v -> v.length >= 3 }
    var validPassword: String by Delegates.vetoable("") { _,_,v -> v.length >= 8 }
}
fun main() {
    val f = Form()
    f.validUsername = "ab";       println(f.validUsername) // ""
    f.validUsername = "alice";    println(f.validUsername) // "alice"
    f.validPassword = "short";    println(f.validPassword) // ""
    f.validPassword = "secure123";println(f.validPassword) // "secure123"
}

Pemeriksaan Singkat

Kapan vetoable memanggil fungsi panggilan baliknya?

Ringkasan

observable memberi tahu setelah setiap perubahan; vetoable berjalan sebelum penetapan dan dapat menolak nilai baru. Keduanya sangat baik untuk pencatatan log, validasi, dan pola properti reaktif tanpa pustaka eksternal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Delegasi observable dan vetoable” gratis?

Ya — teks lengkap “Delegasi observable dan vetoable” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Delegasi observable dan vetoable”?

Tanggapi perubahan properti dengan observable dan tolak perubahan secara bersyarat dengan vetoable. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Delegasi observable dan vetoable” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. by lazy: Pendalaman Inisialisasi Tertunda
  2. Delegasi observable dan vetoable
  3. Menulis Delegasi ReadWriteProperty Kustom
  4. Delegasi untuk Preferensi, Properti Berbasis Map, dan Logging
← Kembali ke Kotlin Academy