扩展Java类时,处理Kotlin中的空情况的最佳方法是什么?
当Kotlin中的某些东西可能为null时,我真的被这种情况困住了。 当一个值不能为空 – 很明显。 但是,如果默认情况下可以为空,该如何处理情况。 看看这个例子:
abstract class MapActivity: AppCompatActivity(), OnMapReadyCallback { lateinit var map: GoogleMap fun initializeMap() { val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(map: GoogleMap?) { this.map = map //error here } }
所以我应该这样处理这种情况:
override fun onMapReady(map: GoogleMap?) { if (map != null) this.map = map }
但是如果map为null呢 。 在这种情况下我应该做什么? 我在使用java时遇到了这个问题。
好吧,在Java中,如果map为null,我们将得到NPE。
对我而言,NPE总比没有好。 程序崩溃,这是我的信号,有什么不对,我应该修复它。 这样,我甚至不能追查我的问题,为什么会发生。 是的,我们可以写下如下的东西:
override fun onMapReady(map: GoogleMap?) { if (map != null) { this.map = map } else { Log.d("Activity","MapIsNull") } }
这个代码有一些意思,是的。 但是我对整个无效安全的事情还是有一些犹豫。 安全的呼叫,例如是奇怪的东西,它产生无效和(在我看来)heisenbugs或难以捉住的错误。
有人可以向我解释这里发生了什么,使用无效安全的最佳做法是什么?
我很确定这个东西是有用的,因为我不像JB里的家伙那么聪明
OnMapReadyCallback的文档明确表示它“提供了一个非空的GoogleMap实例”。 因此, onMapReady
方法的参数类型应使用非null类型。
请注意,当您在Kotlin中实现Java接口时,您可以选择是否将实现方法的参数声明为可为空或非空。 IDE将它们标记为可空,因为它是安全的默认值,但如果这是您所需要的,则可以将它们更改为非null。
关于处理空值:假设你需要在fun onMapReady(map: GoogleMap?)
上有一个fun onMapReady(map: GoogleMap?)
的方法来设置类属性map
。
您有两个设计选项可供选择:
1)如果map
为null
则您的应用程序将不起作用
class A { lateinit var map: GoogleMap // never ever `null` fun onMapReady(map: GoogleMap?) { map = map!! // throws } fun onMapReady2(map: GoogleMap?) { map = map ?: throw Exception("in case you care for the exception") } }
2) Null
对你有特殊意义,可以有:
class A { var map: GoogleMap? = null // map is not ready yet fun onMapReady(map: GoogleMap?) { map = map } }
当然,如果你的情况是(1),你可以控制API,那么你不应该有一个可为空的接收器map: GoogleMap?
因为它混淆了课程的用户。
我看到两个不同的问题:
1.空处理
2. Kotlin空处理的特定语法
首先不是kotlin特定的问题。 这取决于,@voddan几乎解释了可用的策略。
关于语法。 如果您只对非空值感兴趣,请使用let()
override fun onMapReady(map: GoogleMap?) { map?.let { m -> // do your staff // 'm' now is definitely not null } }
如果你想知道什么时候它是空的,使用通常的if-else块
override fun onMapReady(map: GoogleMap?) { if (map != null) { this.map = map } else { Log.d("Activity","MapIsNull") }
图片的标题说明:
1] @Cedric有关于kotlin的let()和朋友的好帖子
2]查看@ yole的评论 。 当在IDEA参数中重写乐趣时可以标记为“?”,但实际上它们不是。