You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin如何合并SharedPreferences键常量与键集合避免重复维护

Kotlin SharedPreferences键免重复维护实现方案

核心目标:实现键定义的单一数据源,自动生成合法键校验集合,无需手动同步两份列表。


方案1:枚举类实现(推荐,类型安全、零维护成本)

用枚举类作为SP键的唯一定义源,全量合法键集合自动从枚举条目生成,新增、删除键只需要修改枚举内容,不需要额外维护集合。

enum class PrefKey(val keyName: String) {
    APP_STYLE("APP_STYLE"),
    STORAGE_PERMISSION_DESCRIPTION_DIALOG_STYLE("STORAGE_PERMISSION_DESCRIPTION_DIALOG_STYLE"),
    RECORD_AUDIO_PERMISSION_DESCRIPTION_DIALOG_STYLE("RECORD_AUDIO_PERMISSION_DESCRIPTION_DIALOG_STYLE"),
    CAMERA_PERMISSION_DESCRIPTION_DIALOG_STYLE("CAMERA_PERMISSION_DESCRIPTION_DIALOG_STYLE");

    companion object {
        // 自动生成全量合法键集合
        val allLegalKeys: Set<String> = entries.map { it.keyName }.toSet()

        // 内置键校验方法
        fun isLegalKey(key: String): Boolean = key in allLegalKeys
    }
}

使用方式

  • 替换原有常量引用:原来用APP_STYLE的地方改为PrefKey.APP_STYLE.keyName
  • 校验合法性:直接调用PrefKey.isLegalKey(待校验的键字符串)即可
  • 后续迭代只需要增删枚举内的条目,allLegalKeys会自动同步,不会出现漏加、错加的问题。

方案2:属性委托自动收集(兼容老项目常量调用习惯)

如果项目中已经存在大量对原有常量的引用,不想大面积修改调用代码,可以用属性委托在定义常量的同时自动把键注册到全量集合中,不需要手动往集合里添加条目。

// 键收集器
object PrefKeyRegistry {
    private val _allLegalKeys = mutableSetOf<String>()
    val allLegalKeys: Set<String> = _allLegalKeys

    // 键定义委托,定义常量时自动完成注册
    fun spKey(keyValue: String): ReadOnlyProperty<Any?, String> {
        _allLegalKeys.add(keyValue)
        return ReadOnlyProperty { _, _ -> keyValue }
    }

    fun isLegalKey(key: String): Boolean = key in allLegalKeys
}

// 定义键时直接用委托,不需要额外维护allPrefKeys列表
private val APP_STYLE by PrefKeyRegistry.spKey("APP_STYLE")
private val STORAGE_PERMISSION_DESCRIPTION_DIALOG_STYLE by PrefKeyRegistry.spKey("STORAGE_PERMISSION_DESCRIPTION_DIALOG_STYLE")
private val RECORD_AUDIO_PERMISSION_DESCRIPTION_DIALOG_STYLE by PrefKeyRegistry.spKey("RECORD_AUDIO_PERMISSION_DESCRIPTION_DIALOG_STYLE")
private val CAMERA_PERMISSION_DESCRIPTION_DIALOG_STYLE by PrefKeyRegistry.spKey("CAMERA_PERMISSION_DESCRIPTION_DIALOG_STYLE")

注意事项

  • 该方案定义的键不是编译期const常量,如果需要在注解参数等要求编译期常量的场景使用,优先选择枚举方案。

校验逻辑使用示例

// 拿到SharedPreferences中存储的所有键,过滤非法键
val spStoredKeys = sharedPreferences.all.keys
val invalidKeys = spStoredKeys.filterNot { PrefKey.isLegalKey(it) }

内容的提问来源于stack exchange,提问作者Vladimir Fisher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:33:08