我想使用 kotlin 数据类作为例外,这看起来不错:
data class MyException(val extraData: Any) : RuntimeException()
Run Code Online (Sandbox Code Playgroud)
我还希望能够cause在存在超类的情况下将 a 传递给超类。不幸的是,数据类只能在其主构造函数中包含val/ var,并且由于默认构造函数调用无参数RuntimeException()构造函数,因此似乎我根本无法在不总是需要cause传递并存储为类中的字段的情况下执行此操作,这我不想。
我想要的是这样的:
data class MyException(val extraData: Any) : RuntimeException() {
constructor(extraData: Any, cause: Throwable) : this(extraData) super(cause) {}
}
Run Code Online (Sandbox Code Playgroud)
看来,即使我不使用数据类,我仍然无法使用方便的var/val构造函数帮助器,因为它们只能位于主构造函数上,而主构造函数必须选择要使用的超级构造函数。我能想到的最好的就是这个,它非常冗长:
class MyException : RuntimeException {
val extraData: Any
constructor(extraData: Any) {
this.extraData = extraData
}
constructor(extraData: Any, cause: Throwable) : super(cause) {
this.extraData = extraData
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?是否真的没有办法根据重载构造函数有条件地调用不同的超类构造函数,并且仍然能够使用var/val参数语法?如果是这样,为什么?有更好的方法来做这种事情吗?
你想要的通过像这样的常规课程是完全可以实现的:
class MyException(val extraData: Any, cause: Throwable? = null) : RuntimeException(cause)
Run Code Online (Sandbox Code Playgroud)
在这里,您有一个主构造函数,它总是接收extraData并从中创建一个属性。val它还接收异常原因,但仅将其传递到超类构造函数中(请注意第二个参数之前没有)。它还利用了 Kotlin 中的默认参数,允许您不指定原因。
不幸的是,您不能在您的情况下专门使用数据类,因为它们的主构造函数不允许具有常规参数。您还必须将原因声明为财产。数据类应该用于最简单的情况,而您有一个更复杂的情况。
如果超类需要有条件地使用两个不同的构造函数进行初始化,那么您也必须在类中使用两个不同的构造函数。任何构造函数必须将超类初始化委托给另一个构造函数或自己完成。它不能同时执行这两项操作,因为这意味着超类被初始化两次,这是没有意义的。此外,超类初始化和委托都发生在构造函数本身执行之前,因此您无法有任何关于执行哪一个的逻辑。
您不能拥有主构造函数,因为它始终需要在存在时委托给它。这意味着属性也必须显式声明,因为属性声明和初始化语法仅适用于主构造函数。
| 归档时间: |
|
| 查看次数: |
2163 次 |
| 最近记录: |