kotlin 中容器的测试项类型

Posted

技术标签:

【中文标题】kotlin 中容器的测试项类型【英文标题】:Test item type of a container in kotlin 【发布时间】:2014-11-11 23:42:34 【问题描述】:

我正在尝试围绕 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>)

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

谢谢!

【问题讨论】:

请在您的问题中添加Android标签 我不同意,因为这个问题实际上是关于 Kotlin 类型检查的。我似乎在 android 开发中遇到它,但这是一个巧合。无论如何我添加标签让你开心:) 或删除对 Android 的引用,Android 代码将整个事情简化为相关部分。 :-) 无论哪种方式都让我开心。 【参考方案1】:

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

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

通用类型信息未具体化,因此您需要为您支持的每种类型引入重载:BooleanFloat 等和Set&lt;String&gt;,或者根本不进行适当的检查

【讨论】:

我试图做类似 Scalaoid Preferences (github.com/pocorall/scaloid/blob/master/scaloid-common/src/main/…) 之类的事情,但重新阅读它表明我也没有管理 Set of String。感谢您的分析!【参考方案2】:

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

【讨论】:

以上是关于kotlin 中容器的测试项类型的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin入门(16)容器的遍历方式

测试字符串是不是包含字符串数组中的任何内容(kotlin)

Kotlin—数据容器之数组

Kotlin—数据容器之数组

Kotlin—数据容器之数组

Kotlin—数据容器之数组