我想使用 kotlin 数据类作为异常(exception),这似乎很好:
data class MyException(val extraData: Any) : RuntimeException()
我也希望能够传入
cause
在那些存在的情况下,到父类(super class)。不幸的是,数据类只能有 val
/var
在它们的主构造函数中,并且由于默认构造函数调用无参数 RuntimeException()
构造函数,似乎我根本无法做到这一点而不总是需要 cause
被传递,并作为字段存储在我的类(class)中,这是我不想要的。我想要的是这样的:
data class MyException(val extraData: Any) : RuntimeException() {
constructor(extraData: Any, cause: Throwable) : this(extraData) super(cause) {}
}
看来就算不使用数据类,还是用不上方便的
var
/val
构造函数助手,因为它们只能在必须选择使用哪个 super 构造函数的主构造函数上。我能想到的最好的就是这个,它非常冗长:class MyException : RuntimeException {
val extraData: Any
constructor(extraData: Any) {
this.extraData = extraData
}
constructor(extraData: Any, cause: Throwable) : super(cause) {
this.extraData = extraData
}
}
我错过了什么吗?真的没有办法基于重载的构造函数有条件地调用不同的父类(super class)构造函数并且仍然能够使用
var
/val
参数语法?如果是这样,为什么?有没有更好的方法来做这种事情?
最佳答案
由于两者 this(...)
& super(...)
是构造函数中的第一条语句,因此您不能同时调用它。否则,您将获得编译时错误。
中频 任何类都包含 primary constructor , 他们的 secondary constructors必须显式调用它的主构造函数,所以你不能调用额外的 super(...)
完全在二级构造函数上。
if the class has a primary constructor, each secondary constructor needs to delegate to the primary constructor, either directly or indirectly through another secondary constructor(s). Delegation to another constructor of the same class is done using the
this
keyword
但是还有另一种方法可以通过 Throwable#initCause 设置原因, 例如:
data class MyException(val extraData: Any) : RuntimeException() {
constructor(extraData: Any, cause: Throwable) : this(extraData) {
initCause(cause)
}
}
和 data class专为 POJO 设计而不是
Exception
s。
关于exception - Kotlin 构造函数属性和调用不同的父类(super class)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110194/