首页 > 解决方案 > Kotlin 构造函数重载

问题描述

我试图重载一个类的构造函数,以便它接受字符串和整数。

class Load (val duration: Int = 0,val minrep: Int = 0,val maxrep: Int = 0): Serializable{

constructor(duration: String = "0",minrep: String = "0",maxrep: String = "0")
        : this(duration.toInt(),minrep.toInt(),maxrep.toInt())

问题是因为我被迫立即调用超级构造函数,我无法检查变量中的“”,这是一种可能的状态,然后将应用程序崩溃到 .toInt()。

所以我想做的是这样的:

constructor(duration: String = "0",minrep: String = "0",maxrep: String = "0") {
    if(duration == "")
        duration = "0"
            ...
    this(duration.toInt(),minrep.toInt(),maxrep.toInt())
}

但是如何?

标签: kotlinconstructorconstructor-overloading

解决方案


将额外的数据转换逻辑提取到某个函数并调用它而不是 simple .toInt()

class Load(val duration: Int = 0, val minrep: Int = 0, val maxrep: Int = 0) {
    companion object {
        //`String` will have this extension function only in the scope of `Load` class
        private fun String.toIntOrZero() = toIntOrNull() ?: 0
    }
    constructor(duration: String = "0", minrep: String = "0", maxrep: String = "0")
            : this(duration.toIntOrZero(), minrep.toIntOrZero(), maxrep.toIntOrZero())
}

请注意,在此实现中,所有其他不可解析的字符串Int也将回退到 0


推荐阅读