Real World Example

Typed SharedPreferences

Android apps store small settings (login token, theme, onboarding done) in SharedPreferences. Writing prefs.getString("token", null) everywhere is error-prone. A custom delegate makes each setting a normal typed property. Here a map stands in for SharedPreferences so the example runs anywhere.

Example

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

// stands in for android.content.SharedPreferences
class FakePrefs {
    val store = sortedMapOf<String, Any>()
}

class Pref<T : Any>(private val prefs: FakePrefs, private val default: T, private val key: String? = null) :
    ReadWriteProperty<Any, T> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(thisRef: Any, property: KProperty<*>): T =
        prefs.store[key ?: property.name] as T? ?: default

    override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
        prefs.store[key ?: property.name] = value
    }
}

class AppSettings(prefs: FakePrefs) {
    var onboardingDone by Pref(prefs, false)
    var theme by Pref(prefs, "system")
    var launchCount by Pref(prefs, 0, key = "launch_count")
}

fun main() {
    val prefs = FakePrefs()
    val settings = AppSettings(prefs)
    println("First launch: onboarding=${settings.onboardingDone}, theme=${settings.theme}")
    settings.launchCount++
    settings.onboardingDone = true
    settings.theme = "dark"
    settings.launchCount++
    println("Stored: ${prefs.store}")
}

Output

First launch: onboarding=false, theme=system
Stored: {launch_count=2, onboardingDone=true, theme=dark}