如何在Kotlin中存储和检索单例类的对象

时间:2018-12-03 17:45:29

标签: kotlin

给出一个单例课程

    object singleton{
    ...
    }

我正在使用单例存储一些与对象相关的值。我正在尝试使用SharedPreferences存储和检索它,以便下次打开应用程序时可以使用该数据。我还需要使用此对象(一旦检索到)在所有活动中。但是,当我这样做

    val x = singleton

我可以存储对象,但是不能像

那样直接访问属性。
    singleton.propertyName

因此,我问有没有其他方法可以比使用SharedPreferences更好的存储和检索方法了 如果我要使用

    x.propertyName

那不是仅使用

进行访问的简单方法
    singleton.propertyName 

丢失了?

如果不是SharedPreferences的话,还有其他方法可以存储该对象吗?

2 个答案:

答案 0 :(得分:0)

这是一个链接,Singletons with argument -Medium

完成代码, 请输入:val r = singleton 然后检索您的对象。

答案 1 :(得分:0)

您不必写x = singleton,我在评论中写道,这只是一种询问您实际需求的方式。

您绝对应该使用SharedPreferences进行持久存储,但是您也可以保留简单的singleton.propertyName语法。您只需要实现自定义getter。这是我使用的一些摘要:

val Context.sharedPrefs: SharedPreferences get() =
    PreferenceManager.getDefaultSharedPreferences(this)

val SharedPreferences.lastReloadedTimestamp: Long get() =
    getLong(KEY_LAST_RELOADED_TIMESTAMP, 0L)

fun SharedPreferences.Editor.setLastReloadedTimestamp(value: Long): SharedPreferences.Editor =
    putLong(KEY_LAST_RELOADED_TIMESTAMP, value)

inline fun SharedPreferences.applyUpdate(block: SharedPreferences.Editor.() -> Unit) {
    with (edit()) {
        try {
            block()
        } finally {
            apply()
        }
    }
}

我不使用单例对象,而是将所有内容都实现为Context上的扩展功能。与将首选项一次加载到RAM中然后在应用程序的生命周期中丢失可能的更新相比,我发现这是一种更安全的方法。

请注意,要设置属性,我不使用自定义设置器,而是使用Editor上的扩展功能。这使我可以在共享事务上的同一事务中对多个更新进行分组:

context.sharedPrefs.applyUpdate {
    setLastReloadedTimestamp(System.currentTimeMillis())
    setLocationLat(location.lat)
    setLocationLon(location.lon)
}