在kotlin中测试容器的项目类型

时间:2014-09-17 19:42:06

标签: android kotlin

我试图围绕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只包含字符串而不包含其他类型来帮助搜索我是否能做得更好。

我试过了:

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,我想要注意的是,示例中的检查可能无法保证您将一组除字符串之外的内容放入编辑器中:如果编辑器实现在放置它时不复制该集合,可以传入一个空集,然后再添加一个字符串以外的东西:

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

通用类型信息未实现,因此您需要为您支持的每种类型引入重载:BooleanFloat等,以及Set<String>,或者不适当检查

答案 1 :(得分:0)

我已经建立了一个类似的图书馆并且它很稳定。您可以根据需要使用它:KPreferences 它采用了完全相似的方法。