<抽象クラス>

/**
 * SharedPreferences抽象クラス
 */
@Suppress("UNCHECKED_CAST") //cast時のwarningを抑制
abstract class AbstractSharedPreferencesManager {
    //SharedPreferencesインスタンス変数
    protected abstract val preferencesName :String
    protected abstract val spf : SharedPreferences

    //setter/getter
    protected fun <T : Any?> preference() = object :ReadWriteProperty<AbstractSharedPreferencesManager, T?>{
        override fun setValue(
            thisRef: AbstractSharedPreferencesManager,
            property: KProperty<*>,
            value: T?
        ) {
            putData(property.name, value)
        }

        override fun getValue(
            thisRef: AbstractSharedPreferencesManager,
            property: KProperty<*>
        ): T? {
            return spf.all[property.name] as? T?
        }
    }

    // データをキーに応じて保存
    protected fun <T : Any?> putData(key: String, value: T?) {
        val editor = spf.edit()
        when (value) {
            is String -> editor.putString(key, value)
            is Boolean -> editor.putBoolean(key, value)
            is Float -> editor.putFloat(key, value)
            is Int -> editor.putInt(key, value)
            is Long -> editor.putLong(key, value)
            null -> editor.remove(key)
            else -> throw IllegalArgumentException("type mismatch")
        }
        editor.apply()
    }
}


<実際にSharedPreferencesに書き込むクラス> SharedPreferenceの名前ごとに作ると色々できるんだぜ的な
**
 * SharedPreference読み書きクラス
 */
class SharedPreferenceManager : AbstractSharedPreferencesManager() {

    //インスタンスセット
    override val preferencesName: String = "context"
    override val spf: SharedPreferences = MyApplication.appContext.getSharedPreferences(preferencesName, Context.MODE_PRIVATE)

    //staticメソッド
    companion object {
        private var instance :SharedPreferenceManager? = null

        //インスタンス取得
        fun getInstance() = instance ?: synchronized(this) {
            instance ?: SharedPreferenceManager().also { instance = it }
        }

        //初期化
        fun initialize() {
            instance = SharedPreferenceManager()
        }
    }

    //プロパティ
    var testString :String? by preference()
    var testInt :Int? by preference()
    var testBoolean :Boolean? by preference()
    var testFloat :Float? by preference()
    var testLong :Long? by preference()

}


これで色んな名前のSharedPreferenceが作れるぜ的な。


使い方
何回も同じこと書くのは大変なのでapplyでまとめる。書き込み
SharedPreferenceManager.apply {
    initialize()
    getInstance().apply {
        testString = "a"
        testBoolean = true
        testFloat = 0.0f
        testInt = 1
        testLong = 0
    }
}
読み込み(ちゃんとapplyの外で変数宣言しないと切ないことになるよ)
SharedPreferenceManager.apply { 
  initialize()
    getInstance().apply {
        val s :String? = testString
        val b :Boolean? = testBoolean
        val f :Float? = testFloat
        val i :Int? = testInt
        var l :Long? = testLong
    }
}
なんかもうちょいいいやり方ある気がする
Device File Manager> data/data/[パッケージ名]/shared_prefs内にある。
ファイルがないのにgetすると普通にnull返ってくる。