Kotlin:创建通用数值比较函数及解决重复代码异味
优化Kotlin数值生成函数:消除重复代码并实现通用校验逻辑
嘿,针对你遇到的这个重复代码问题,我们可以利用Kotlin的泛型和Comparable接口来实现通用的数值校验逻辑,彻底消除代码异味。下面是具体的解决方案:
问题分析
你的Random对象里的每个数值生成函数(比如generatePositiveFloat)都重复了两段校验逻辑:
- 检查左边界不能为负
- 检查右边界必须严格大于左边界
如果后续新增其他数值类型的生成函数(比如generatePositiveDouble、generatePositiveInt),这些校验代码还会被重复复制,既冗余又不利于维护。
解决方案
我们可以把公共的校验逻辑抽离成一个通用的泛型函数,因为所有数值类型(Float、Double、Int等)都实现了Comparable接口,天然支持比较操作。
1. 实现通用的范围校验函数
首先,创建一个通用的校验函数,接收任意实现了Comparable的数值类型,完成边界校验:
import java.security.InvalidAlgorithmParameterException private fun <T : Comparable<T>> validatePositiveRange(leftLimit: T, rightLimit: T) { // 检查左边界是否为负(针对数值类型,通过和0的比较判断) if (leftLimit < 0 as T) { throw InvalidAlgorithmParameterException("Left limit can't be negative") } // 检查右边界是否大于左边界 if (rightLimit <= leftLimit) { throw InvalidAlgorithmParameterException("Right limit can't be less or equal than left limit") } }
2. 重构原有的Random对象
接下来,修改你的Random对象,让每个生成函数调用这个通用校验函数,消除重复代码:
import java.security.InvalidAlgorithmParameterException import kotlin.random.Random object RandomGenerator { // 重命名避免和标准库Random类冲突 internal fun generatePositiveFloat( leftLimit: Float = Float.MIN_VALUE, rightLimit: Float = Float.MAX_VALUE ): Float { validatePositiveRange(leftLimit, rightLimit) return Random.nextFloat() } internal fun generatePositiveDouble( leftLimit: Double = Double.MIN_VALUE, rightLimit: Double = Double.MAX_VALUE ): Double { validatePositiveRange(leftLimit, rightLimit) return Random.nextDouble() } internal fun generatePositiveInt( leftLimit: Int = Int.MIN_VALUE, rightLimit: Int = Int.MAX_VALUE ): Int { validatePositiveRange(leftLimit, rightLimit) return Random.nextInt(leftLimit, rightLimit) } }
优化亮点
- 通用型:通过泛型和
Comparable接口,一套校验逻辑支持所有数值类型,无需为每个类型重复编写判断 - 可维护性:如果后续需要修改校验规则(比如调整错误提示、新增校验条件),只需要修改
validatePositiveRange这一个函数即可 - 兼容性:原有函数的参数默认值、返回类型和调用方式完全不变,不会影响现有代码的使用
- 可读性:抽离后的生成函数逻辑更简洁,专注于核心的数值生成逻辑,代码意图更清晰
内容的提问来源于stack exchange,提问作者Yisus Threepwood
相关产品推荐
相关产品推荐

