Using Kotlin's ReadWriteProperty for modern Android Preference handling
Kotlin の ReadWriteProperty を使って Delegate して Preference をいい感じにするやつを使ってみました. ちなみに ReadWriteProperty は以下のように定義されています.
interface ReadWriteProperty<in R, T>ReadWriteProperty - Kotlin Programming Language
ReadWriteProperty
Section titled “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 を使っていこう.