这有点丑陋:
override var x1: Double = 0.0 //x-coordinate for object
get() =
if(hasParent) { //if there is no parent, we can't have an x coord anyway - nowhere to draw this object
if (hasPrev) { //we won't always have a previous event, thus the other branch
prev!!.x2 + parent!!.mEventSpacing
} else {
parent!!.mEventStartX
}
} else {
field
}
是否可以将其替换为以下内容?
override var x1: Double = 0.0
get() = (prev?.x2 + parent?.mEventSpacing) ?: parent?.mEventStartX ?: field
逻辑显然不对,但有接近这个的东西吗?还是需要一些认真的粉丝才能做这么简单的事情?
假设hasParent = parent != null
和hasPrev = prev != null
.
还假设parent
和prev
被定义为val
,而不是在if
或when
语句中var
,因为我不喜欢多次添加!!
。
您正在做的是,使用when
表达式:
override var x1: Double = 0.0 //x-coordinate for object
get() = when {
parent != null && prev != null -> prev.x2 + parent.mEventSpacing
parent != null && prev == null -> parent.mEventSpacing
parent == null -> field
}
您可以使用?.
话务员和let
功能的组合(请参阅安全呼叫部分):
override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing } ?: field
let
函数执行参数块,其参数称为let
,并返回参数块中的最后一个表达式。
例如,1.let { it + 2 }
是3
。
如果x
不为 null,则x?.let
执行let
函数。 即,x?.let { ... }
与if (x != null) x.let { ... } else null)
相同。
这里
如果parent == null
,那么parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing }
就是null
。
如果parent != null
,
则parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing }
与prev?.let { pv -> pv.x2 + parent!!.mEventSpacing } ?: parent!!.mEventSpacing
相同
如果prev == null
,则可以将prev.x2
视为0
。所以
override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> (prev?.let { pv -> pv.x2 } ?: 0) + pr.mEventSpacing } ?: field
您可以通过在内部let
函数中使用it
来进一步缩短此时间。
override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> (prev?.let { it.x2 } ?: 0) + pr.mEventSpacing } ?: field
此外,您可以使用run
和let
的组合。(谷歌kotlin run
或kotlin run vs let
,如果你不知道的话。
override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.run { (prev?.let { it.x2 } ?: 0) + mEventSpacing } ?: field
但我认为使用when
是最容易理解的。
好吧,如果parent
和prev
被定义为var
,那么将when
表达式与!!
一起使用可以引发NPE,而使用?.let
,?.run
和?:
永远不会在多核设备中引发NPE。为了防止这种情况,您可以使用 getter 函数中的当前值定义局部val
,这样您就永远不需要使用!!
运算符。