大佬教程收集整理的这篇文章主要介绍了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,请注明来意。