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
相关产品推荐
相关产品推荐

