kotlin - 访问 Kotlin 属性时的“java.lang.StackOverflowError”
问题描述
我从 Packt 的“Programming Kotlin”中得到了这个(人为的)示例,关于使用带有继承的辅助构造函数。
编辑:从答案中可以清楚地看出问题与支持字段有关。但这本书没有介绍这个想法,只是用了错误的例子。
open class Payment(val amount: Int)
class ChequePayment : Payment {
constructor(amount: Int, name: String, bankId: String) : super(amount) {
this.name = name
this.bankId = bankId
}
var name: String
get() = this.name
var bankId: String
get() = this.bankId
}
val c = ChequePayment(3, "me", "ABC")
println("${c} ${c.amount} ${c.name}")
当我运行它时,会显示此错误。
$ kotlinc -script class.kts 2>&1 | more
java.lang.StackOverflowError
at Class$ChequePayment.getName(class.kts:10)
at Class$ChequePayment.getName(class.kts:10)
at Class$ChequePayment.getName(class.kts:10)
第10行似乎是无限递归,如何解决?
解决方案
您的代码中有一个递归:
class ChequePayment : Payment {
constructor(amount: Int, name: String, bankId: String) : super(amount) {
this.name = name
this.bankId = bankId
}
var name: String
get() = this.name // recursion: will invoke getter of name (itself)
var bankId: String
get() = this.bankId // recursion: will invoke getter of bankId (itself)
}
如果您的 getter 不需要自定义逻辑,只需将您的属性保留为:
var name: String
var bankId: String
它们将有一个默认的 getter,它只是返回支持字段的值。
注意:代码可以/应该重构为:
class ChequePayment(amount: Int, var name: String, var bankId: String) : Payment(amount) {
// ...
}
这使用了主构造函数,并且冗余度要低得多。
推荐阅读
- python - Pandas 将多列堆叠成一列
- python - 如果不满足条件,则比较数据框内容并更改列颜色
- kubernetes - Env Variable Array
- angular - I have a problem while running angular application
- wordpress - Memcached / Redis Wordpress Setup
- frontend - TYPO3 Extbase FE form - how to remove/delete inline relation
- python - Django get rid of duplicated queries in nested models
- xml - Is there a way to specify an alternate xsd source for a single namespace
- python - 使用偏移量时滚动窗口函数的意外结果
- c++ - how to define two dimensional string , not a char vector in C++