Careeroza
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}