【问题标题】:How to store and retrieve an object of singleton class in Kotlin如何在 Kotlin 中存储和检索单例类的对象
【发布时间】:2018-12-04 14:59:24
【问题描述】:

给定一个单例类

    object singleton{
    ...
    }

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

    val x = singleton

我可以存储对象,但不能直接访问属性

    singleton.propertyName

因此我问是否有任何其他方式来存储和检索比使用 SharedPreferences 更好 如果我使用

    x.propertyName

then 不是仅使用

的简单访问方式
    singleton.propertyName 

迷路了?

如果 SharedPreferences 不是要走的路,还有其他方法来存储这个对象吗?

【问题讨论】:

  • 只要写这个,你就已经把它存储在 RAM 中了。通过写val x = singleton,您已检索到它。你到底在问什么?
  • @MarkoTopolnik 在问题中指定了需求。

标签: kotlin


【解决方案1】:

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

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

【讨论】:

  • '当单例的具体实现由外部工具或库(Retrofit、Room 等)生成并使用自定义构建器或工厂方法检索其实例时,您通常将单例声明为一个接口或抽象类,它不能是一个对象'。从链接中得到这个!!!谢谢!!!
  • @user10740241 没问题!
【解决方案2】:

您不必写x = singleton,我在评论中写了这只是为了询问您的实际需求。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2020-07-13
    • 2011-11-14
    • 2011-08-12
    • 1970-01-01
    • 2011-07-22
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多