0

我正在尝试围绕 Android SharedPreferences 编写一些 Kotlin 包装器,我现在正在使用以下代码:

class KPreferences(ctx: Context) {
    val prefs = ctx.getSharedPreferences(ctx.getString(R.string.app_name), Context.MODE_PRIVATE)

    fun put(key: String, value: Any): Boolean {
        val editor = prefs.edit()
        when (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)
            is String -> editor.putString(key, value)
            is Set<*> -> editor.putStringSet(key, value as Set<String>)
        }
        return editor.commit()
    }

这可以编译,但如果我不能通过确保 Set 仅包含 String 而没有其他类型来使其变得更好,我会忍不住搜索。

我试过这个:

fun put(key: String, value: Any): Boolean {
        val editor = prefs.edit()
        when (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)
            is String -> editor.putString(key, value)
            is Set<*> ->
                if (value.isEmpty() || value.iterator().next() is String) {
                    editor.putStringSet(key, value as Set<String>)
                }
        }
        return editor.commit()
    }

但这似乎太不优雅了。

另一种方法是定义

fun put(key: String, value: Set<String>)

并删除我尝试的最后一个案例。我只是想知道我是否在这里遗漏了任何优雅的解决方案。

谢谢!

4

2 回答 2

1

首先,我想指出,您在示例中进行的检查可能不能保证您不会将一组字符串以外的东西放入您的编辑器:如果编辑器实现在放入时没有复制该集合,则可以传入一个空集,然后在其中添加除字符串以外的其他内容:

val set = HashSet<Int>()
prefs.put("...", set) // set is empty, the check lets it through
set.add(1)

通用类型信息没有被具体化,因此您需要为您支持的每种类型引入重载:BooleanFloat等等,and Set<String>,或者根本不进行适当的检查

于 2014-09-18T13:30:25.747 回答
0

我已经制作了一个类似的库并且它很稳定。如果需要,您可以使用它:KPreferences 它使用完全相似的方法。

于 2017-03-27T11:27:08.430 回答