Using Kotlin's ReadWriteProperty for modern Android Preference handling

Photo by Louis Tsai on Unsplash

Kotlin ぎ ReadWriteProperty をäŊŋãŖãĻ Delegate しãĻ Preference をいい感じãĢするやつをäŊŋãŖãĻãŋぞしたīŧŽ
ãĄãĒãŋãĢ ReadWriteProperty はäģĨ下ぎようãĢåŽšįžŠã•ã‚ŒãĻいぞすīŧŽ

interface ReadWriteProperty<in R, T>

ReadWriteProperty - Kotlin Programming Language

ReadWriteProperty

䞋えば int を Preference ãĢå…Ĩれる ReadWriteProperty

class IntPreference(
        private val preferences: SharedPreferences,
        private val name: String,
        private val defaultValue: Int
) : ReadWriteProperty<Any, Int> {@WorkerThread
    override fun getValue(thisRef: Any, property: KProperty<*>): Int {
        return preferences.getInt(name, defaultValue)
    }override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) {
        preferences.edit().putInt(name, value).apply()
    }
}

äŊŋう側

あとはäģĨ下ぎようãĒ感じで Delegate

class SharedPreferenceStorage(context: Context) {
    private val prefs = context.applicationContext.getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
    companion object {
        private const val PREFS_NAME = "example.prefs"
        private const val PREF_MESSAGE_COUNT = "pref_message_count"
    }
    var messageCount by IntPreference(prefs, PREF_MESSAGE_COUNT, 200)
}

äŊ•がいいか

䞋えば Preference ãĢå‡ēしå…Ĩれする値が多いとäģĨ下ぎようãĢ set()と get()をäŊ•回も書かãĒければãĒりぞせんīŧŽ

var hoge: String
    get() = preference.getString(HOGE, "")
    set(value) = preference.edit().putString(HOGE, value).apply()

var huga: String
    get() = preference.getString(HUGA, "")
    set(value) = preference.edit().putString(HUGA, value).apply()

var foo: String
    get() = preference.getString(FOO, "")
    set(value) = preference.edit().putString(FOO, value).apply()

var bar: String
    get() = preference.getString(BAR, "")
    set(value) = preference.edit().putString(BAR, value).apply()

上がこうãĒるīŧŽ
きれいīŧŽ

var hoge by StringPreference(prefs, HOGE, "hoge")
var huga by StringPreference(prefs, HUGA, "huga")
var foo by StringPreference(prefs, FOO, "foo")
var bar by StringPreference(prefs, BAR, "bar")

ぞとめ

Preference が多くãĒã‚‹ã ã‚ã†ã¨æ€ã‚ã‚Œã‚‹ã¨ãã¯įŠæĨĩįš„ãĢ ReadWriteProperty をäŊŋãŖãĻいこうīŧŽ