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

如何用Sealed Class实现字符串匹配获取对应元素名称?

用密封类实现元素符号与名称的匹配替代when语句

你可以用密封类实现更具可维护性和类型安全性的字符串匹配,相比直接用when语句,这种方式能避免硬编码魔法字符串,后续扩展元素也更方便。

实现步骤

1. 定义密封类封装元素信息

把每个元素作为密封类的单例对象,内置符号和名称属性:

sealed class Element(val symbol: String, val name: String) {
    object Neon : Element("Ne", "Neon")
    object Argon : Element("Ar", "Argon")
    object Krypton : Element("Kr", "Krypton")
    object Xenon : Element("Xe", "Xenon")
    object Radon : Element("Rn", "Radon")
    object Bromine : Element("Br", "Bromine")
}

2. 自动构建符号到元素的映射

利用密封类的特性,在伴生对象里自动生成符号与元素实例的映射表,不用手动维护对应关系:

sealed class Element(val symbol: String, val name: String) {
    object Neon : Element("Ne", "Neon")
    object Argon : Element("Ar", "Argon")
    object Krypton : Element("Kr", "Krypton")
    object Xenon : Element("Xe", "Xenon")
    object Radon : Element("Rn", "Radon")
    object Bromine : Element("Br", "Bromine")

    companion object {
        val symbolToElement = Element::class.sealedSubclasses
            .mapNotNull { it.objectInstance } // 获取所有密封类的单例实例
            .associateBy { it.symbol } // 以元素符号为键,实例为值构建映射
    }
}

3. 实现名称匹配函数

通过映射表快速查找对应元素的名称,找不到则返回空字符串:

fun getName(symbol: String): String {
    return Element.symbolToElement[symbol]?.name ?: ""
}

优势对比

  • 可维护性:新增元素时,只需要在密封类中添加一个新的object,映射表会自动更新,不用修改匹配逻辑的分支
  • 类型安全:所有元素都被封装在密封类中,避免了拼写错误的魔法字符串(比如误写"ne"而非"Ne"时,只会返回空,不会触发错误分支)
  • 扩展性:如果后续需要给元素添加更多属性(如原子序数、原子量),直接在Element类中扩展即可,其他依赖元素信息的功能可以直接复用这个类

可选优化:支持大小写不敏感匹配

如果需要忽略符号的大小写,可以在构建映射或查找时统一转换为小写:

// 伴生对象中修改映射构建逻辑
val symbolToElement = Element::class.sealedSubclasses
    .mapNotNull { it.objectInstance }
    .associateBy { it.symbol.lowercase() }

// 修改getName函数
fun getName(symbol: String): String {
    return Element.symbolToElement[symbol.lowercase()]?.name ?: ""
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:09:23