假设hasParent = parent != null
和hasPrev = prev != null
。
还假设parent
andprev
被定义为val
,而不是var
在if
orwhen
语句中,因为我不喜欢!!
多次添加。
你正在做的是,使用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?.let
如果不为空则执行let
函数。x
即,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
您可以通过it
在内部let
函数中使用来进一步缩短它。
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
表达式 with!!
可以引发 NPE,而使用?.let
,?.run
和?:
永远不会在多核设备中引发 NPE。为了防止这种情况,您可以val
使用 getter 函数中的当前值定义 local s,这样您就永远不需要使用!!
运算符。