【发布时间】:2019-12-18 03:24:35
【问题描述】:
我正在学习 Kotlin。我想知道这是解决此问题的最佳方法: 我有一个简单的类:
class AlternativeCustomerTwo(
val name: String = "Name Not Provided",
var age: Int? = null,
var address: String = "Address not provided"
)
它有默认参数,还有一个可以为空的年龄。
我想包含以下字段:
var isApproved: Boolean = false
所以现在我有一个看起来像这样的类:
class AlternativeCustomerTwo(
val name: String = "Name Not Provided",
var age: Int? = null,
var address: String = "Address not provided"
) {
var isApproved: Boolean = false}
现在我想覆盖 isApproved 的默认设置器,它检查年龄是否超过 21 岁,如果是,则将其设置为 true。像这样的:
class AlternativeCustomerTwo(
val name: String = "Name Not Provided",
var age: Int? = null,
var address: String = "Address not provided"
) {
var isApproved: Boolean = false
set(value) {
if(age >= 21) {
field = value
}
}
}
这里的问题是var age。代码无法编译,这是错误:
Error:(19, 20) Kotlin: Operator call对应一个点限定 调用 'age.compareTo(21)' 这在可为空的接收器上是不允许的 “年龄”。
经过一番修改,我实现了如下所需的功能:
class AlternativeCustomerTwo(
val name: String = "Name Not Provided",
var age: Int? = null,
var address: String = "Address not provided"
) {
var isApproved: Boolean = false
set(value) {
age?.let {
if(it >= 21) {
field = value
}
}
}
}
如果我这样称呼它:
val customer = AlternativeCustomerTwo(name = "John", age = 120)
customer.isApproved = true
然后打印:true
交替
val customer = AlternativeCustomerTwo(name = "John", age = 12)
customer.isApproved = true
它打印错误 我的问题,这是正确的方法,还是我正在做一些可怕的 Kotlin?
【问题讨论】:
-
当年龄为空时,你的二传手不会做任何事情。您可以在
let之后添加?:以返回其他内容或引发错误。关于?.let是否适合空检查,网上有一些争论。我认为let在这种情况下是可以的,但可能有更好的解决方案。 -
我已经更新了问题,以通话为例/
标签: kotlin