程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Kotlin 构造函数重载大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Kotlin 构造函数重载?

开发过程中遇到Kotlin 构造函数重载的问题如何解决?下面主要结合日常开发的经验,给出你关于Kotlin 构造函数重载的解决方法建议,希望对你解决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",maxrep: String = "0") {
    if(duration == "")
        duration = "0"
            ...
    this(duration.toInt(),maxrep.toInt())
}

但是如何?

解决方法

将额外的数据转换逻辑提取到某个函数并调用它而不是简单的.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

,

有一个快速而肮脏的方法;您只需要知道 Kotlin 中的 if is an expression:

class Load(val duration: Int = 0,val maxrep: Int = 0): serializable {
    constructor(duration: String = "0",maxrep: String = "0")
        : this(if (duration == "") 0 else duration.toInt(),minrep.toInt(),maxrep.toInt())
}

但是,这很快就会变得笨拙,并且您可以通过这种方式进行的处理是有限的。 (正如另一个答案所示,您可以调用辅助方法,但它仍然很尴尬。)

因此,更通用的解决方案是使用工厂方法:执行所需的任何处理,然后然后调用构造函数。在 Java 中,这将是一个静态方法; Kotlin 等价物是类的 companion object 上的一个方法:

class Load(val duration: Int = 0,val maxrep: Int = 0): serializable {
    companion object {
        operator fun invoke(duration: String = "0",maxrep: String = "0"): Load {
            val dur = if (duration == "") 0 else duration.toInt()
            // ...
            return Load(dur,maxrep.toInt())
        }
    }
}

这里的神奇之处在于,通过将其设为 operator fun invoke(),您可以将其称为 Load(…),因此它看起来就像调用普通构造函数一样!

(这仅适用于它的作用很明显的情况,仅从参数类型来看。 如果不明显,或者如果您需要两个具有相同参数类型的工厂方法,则使用常规命名方法更好。)

>

工厂方法让你可以更好地控制对象的创建方式:它们允许你在调用构造函数之前进行任意数量的处理;他们可以返回一个缓存对象,而不是每次都创建一个新实例;如果合适,他们可以返回一个子类。 (但是,一个缺点是它们不适用于继承。)

,

我暂时是这样解决的,但是来自python的感觉又不好看又臃肿,一定有更好的方法:

class Load (duration: String = "0",maxrep: String = "0"): serializable{

var m_duration : Int = 0
var m_maxrep : Int = 0
var m_minrep : Int = 0

init{
    m_duration = if(duration=="") 0 else duration.toInt()
    m_maxrep = if(maxrep=="") 0 else maxrep.toInt()
    m_minrep = if(minrep=="") 0 else minrep.toInt()
}
constructor(duration: Int = 0,minrep: Int = 0,maxrep: Int = 0)
        : this(duration.toString(),minrep.toString(),maxrep.toString())

大佬总结

以上是大佬教程为你收集整理的Kotlin 构造函数重载全部内容,希望文章能够帮你解决Kotlin 构造函数重载所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: