像其他所有人一样,我正在学习Kotlin。我正在努力做对。所以我在类中声明了一个变量:
private lateinit var mLastMarker: Marker
mLastMarker会跟踪我上次使用标记的时间,以便在制作新标记时可以将其删除(Google Maps API)。因此,在添加新标记时,我首先要删除旧标记:
// remove last marker (if it exists)
mLastMarker?.remove()
// add this marker to the map
mLastMarker = mMap.addMarker(markerOptions)
这对我来说很有意义。我想我只会在不为null的情况下执行该remove()
函数mLastMarker
。它会在之后立即设置,因此会remove()
在第一个之后每次调用(如果有要删除的内容)。
但是我得到警告。?.
标题中将突出显示警告消息。是什么赋予了?我对Kotlin的无效安全性缺少什么?
使用lateinit
,null
值将永远不会存储在您的媒体资源中。请注意,它的类型Marker
不是可为null的Marker?
类型-实际上,您不能同时创建可为null和的属性lateinit
。
通过使用lateinit
,您是说编译器不必在任何时候检查可为空性,并且始终希望在读取属性之前,该属性中已经有一个值。如果您在设置之前先阅读过该内容,则不会得到null
,而是会抛出异常。如果您给它提供了一个值,则也永远无法将其设置回未初始化状态,因为它不会被接受null
为新值。
通常,lateinit
如果您想在开始使用某个东西之前对其进行一次初始化,则很好,但是由于某种原因在创建该属性时(例如,在构造类时)无法对其进行初始化。
如果您有时需要检查当前是否有值,则使用可为空的属性可能会更好(尽管从技术上讲,您可以检查lateinit
变量是否已初始化,但这不是很漂亮)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句