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

