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

Kotlin中如何简化重复when分支代码以减少冗余有效行数?

Kotlin 多重复分支逻辑优化方案

你这段代码的重复点是每个分支都做「判断对应属性为空→执行删除→返回true」的相同逻辑,我们可以把枚举值和对应的属性校验逻辑做关联,消除重复分支。

方案1:维护枚举与属性的映射表(无需修改原有枚举类)

提前构建映射关系,把每个枚举值和对应提取ComposableResource属性的KProperty绑定,后续新增分支仅需要新增一行映射即可:

// 全局/伴生对象内提前定义映射,仅初始化一次
private val qualifierCheckMap = mapOf(
    QualifierConfiguration.MCCAndMNC to ComposableResource::mcc,
    QualifierConfiguration.LanguageAndRegion to ComposableResource::languageAndRegion,
    QualifierConfiguration.LayoutDirection to ComposableResource::layoutDirection
    // 后续新增枚举只需要加一行映射
)

原业务逻辑可直接简化:

if (qualifierCheckMap.getValue(qualifier).get(composableResource) == null) {
    resources.removeAt(index)
    return true
}
return false

也可以进一步简化为单行返回逻辑:

return qualifierCheckMap.getValue(qualifier).get(composableResource)?.let { false } ?: run {
    resources.removeAt(index)
    true
}

方案2:校验逻辑内聚到枚举类(可修改枚举定义时推荐)

如果允许修改QualifierConfiguration枚举类,可以把校验逻辑直接定义为枚举的成员方法,符合开闭原则,新增枚举时不会漏写校验逻辑:

enum class QualifierConfiguration {
    MCCAndMNC {
        override fun isResourceInvalid(res: ComposableResource) = res.mcc == null
    },
    LanguageAndRegion {
        override fun isResourceInvalid(res: ComposableResource) = res.languageAndRegion == null
    },
    LayoutDirection {
        override fun isResourceInvalid(res: ComposableResource) = res.layoutDirection == null
    };

    abstract fun isResourceInvalid(resource: ComposableResource): Boolean
}

原业务逻辑直接简化为:

if (qualifier.isResourceInvalid(composableResource)) {
    resources.removeAt(index)
    return true
}
return false

方案对比

  • 映射表方案:适合无法修改原有枚举定义的场景,所有校验逻辑集中在业务侧维护
  • 枚举内聚方案:校验逻辑和枚举绑定,新增枚举时强制实现校验逻辑,避免漏写分支,长期维护成本更低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:48:01