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

これはコンパイルされますが、セットに文字列のみが含まれ、他の型が含まれていないことを確認して、これを改善できない場合は、検索せずにはいられません。

私はこれを試しました:

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など、およびSet<String>、または適切なチェックをまったく行わない

于 2014-09-18T13:30:25.747 に答える