Kotlin如何优雅判断值匹配指定常量且保留常量语义
Kotlin多常量等值判断的优雅实现方案
你可以根据项目的实际场景,从以下两种实现方式中选择,都能兼顾判断逻辑的简洁性和常量语义:
- 方案1:预定义合法值集合(改动成本最低)
保留现有的常量定义,在伴生对象中额外声明一个存储所有合法值的只读Set集合,所有常量都会被显式引用,不会出现定义后未使用的问题,判断逻辑也比多个||拼接的写法简洁很多。
这个写法比最初用的范围判断安全得多:如果后续修改常量取值,不会出现范围判断误包含区间内非预设值的隐蔽bug;集合名companion object { private const val NEGATIVE_POSITION = -1 private const val ZERO_POSITION = 0 private const val POSITIVE_POSITION = 1 // 统一维护合法位置值列表 private val VALID_POSITIONS = setOf( NEGATIVE_POSITION, ZERO_POSITION, POSITIVE_POSITION ) } // 业务代码中的判断逻辑 if (position in VALID_POSITIONS) { // 处理逻辑 }VALID_POSITIONS本身也能清晰传递判断逻辑的含义。如果这个判断逻辑只在单处使用,也可以直接在判断语句内写position in setOf(NEGATIVE_POSITION, ZERO_POSITION, POSITIVE_POSITION),只是多次使用时建议抽成常量避免重复创建集合实例。 - 方案2:枚举类封装状态(语义与可维护性最优)
如果这三个常量代表的是负向位置、零位、正向位置三类明确的业务状态,直接用枚举类替代零散的整型常量是更好的选择,既能完全保留语义,还能获得类型安全的优势:
这种写法把位置相关的所有定义和逻辑都收敛到了枚举类中,后续如果要新增位置类型、给不同位置增加专属处理逻辑,都不需要修改外部的判断代码,长期维护成本更低。enum class Position(val value: Int) { NEGATIVE(-1), ZERO(0), POSITIVE(1); companion object { fun isValid(value: Int): Boolean = entries.any { it.value == value } } } // 业务代码中的判断逻辑 if (Position.isValid(position)) { // 处理逻辑 }
注意:不建议继续使用区间范围判断的写法,除了语义模糊、
ZERO_POSITION未被显式引用的问题外,一旦后续有人调整常量的数值(比如把POSITIVE_POSITION修改为2),区间判断会自动把-1到2之间所有非预设值判定为合法,很容易引入难以排查的逻辑错误。
内容的提问来源于stack exchange,提问作者testivanivan
相关产品推荐
相关产品推荐

