在Kotlin中,枚举(enum class)允许声明一组有限的值,并可以通过方法和属性扩展它们。
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum元素是单例,对应类的实例。enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name)、索引(ordinal)访问每个值,并通过values()获取完整列表。==(身份)比较枚举,因为元素是唯一的。可以在Kotlin的enum类中定义抽象方法,像在Java中那样,让每个元素重写它吗?
正确答案: 可以在enum风格中声明抽象方法,每个元素必须提供自己的实现!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
故事
在从Java迁移到Kotlin时,团队试图像普通类一样继承新的enum类——结果发现枚举不能继承,破坏了架构。必须彻底改变状态机模块化的方法。
故事
为了在数据库中存储值,使用了元素的名称(
enum.name),但在重构中枚举元素被重命名——数据库中的数据与新逻辑不符,导致一致性丧失(未实现存储值模式)。
故事
为了通过Gson序列化enum类,忘记连接自定义TypeAdapter。在生产环境中,服务开始返回不正确的JSON值,因为标准解析器序列化了错误的字段(ordinal或name),导致微服务之间的反序列化不一致。