Kotlin密封类能否实现枚举类的常量属性赋值功能?
用密封类实现与枚举相同的Direction功能
当然可以!密封类完全能实现和你现有枚举类一模一样的功能,甚至还能给你留足后续扩展的空间。下面一步步来看怎么实现:
基础密封类实现(对应你的枚举)
你可以把每个枚举实例转换成密封类的object子类——它们都是单例,和枚举实例的特性完全一致:
sealed class Direction { abstract val code: Int object UP : Direction() { override val code = 10 } object DOWN : Direction() { override val code = 20 } object LEFT : Direction() { override val code = 30 } object RIGHT : Direction() { override val code = 40 } object NONE : Direction() { override val code = 0 } }
用法和枚举完全一致
你原来的插入代码saveDirection(Direction.Right.code),换成密封类后直接写成saveDirection(Direction.RIGHT.code)就行,调用方式没有任何变化,完全兼容你现有的数据库操作逻辑。
密封类的额外灵活性
这也是密封类比枚举更强大的地方:如果之后你需要支持自定义的方向(比如用户自己定义的code值),密封类可以轻松扩展出普通子类,而枚举做不到。比如:
sealed class Direction { abstract val code: Int // 原有的固定方向单例 object UP : Direction() { override val code = 10 } object DOWN : Direction() { override val code = 20 } object LEFT : Direction() { override val code = 30 } object RIGHT : Direction() { override val code = 40 } object NONE : Direction() { override val code = 0 } // 新增支持自定义code的子类 class Custom(override val code: Int) : Direction() }
现在你可以创建自定义方向实例:Direction.Custom(50),这个功能枚举是无法实现的。
从数据库code转回Direction实例
和枚举类似,你可以在密封类里添加一个伴生对象方法,用来把数据库里的整数值转换成对应的Direction实例:
sealed class Direction { abstract val code: Int // ...各个object和Custom子类 companion object { fun fromCode(code: Int): Direction { return when(code) { 10 -> UP 20 -> DOWN 30 -> LEFT 40 -> RIGHT 0 -> NONE // 这里可以根据需求处理未知code:返回Custom实例或者抛出异常 else -> Custom(code) } } } }
查询数据库时,就可以用Direction.fromCode(dbQueryResult)来快速获取对应的Direction对象,和枚举的Direction.values().first { it.code == code }逻辑类似,但更可控。
总结
如果你的需求只是和现有枚举完全一致,密封类的单例子类实现可以完美替代枚举,用法几乎无差别;如果之后有扩展自定义方向的需求,密封类的灵活性会帮你省很多事。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

