kotlin - 扩展 Java 类时,在 Kotlin 中处理 null 情况的最佳方法是什么?

标签 kotlin

当 Kotlin 中的某些内容可能为空时,我真的陷入了困境。当一个值不能为空时 - 很清楚。但是如何处理默认情况下可以为空的情况。看看这个例子:

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 是 .在这种情况下我该怎么办?我在使用java时遇到了这个问题。

好的,在java中,如果map为null,我们将得到NPE。

对我来说,NPE 总比没有好。程序崩溃了,这对我来说是一个信号,表明出了点问题,我应该修复它。这样,我什至无法追踪我的问题以及它发生的原因。
是的,我们可以这样写:
override fun onMapReady(map: GoogleMap?) {
    if (map != null) {
        this.map = map
    } else {
        Log.d("Activity","MapIsNull")
    }    
}

这段代码有一些含义,是的。
但是对于整个零安全问题,我仍然有些犹豫。
例如,安全调用是一种奇怪的事情,它会产生 null 和(在我看来)难以捕捉的 heisenbug 或错误。

有人可以向我解释这里发生了什么,以及使用空安全的最佳做法是什么。

我很确定这东西很有用,因为我不像JB的人那么聪明

最佳答案

OnMapReadyCallback 的文档明确表示它“提供了 GoogleMap 的非空实例”。因此,onMapReady 的参数类型方法应该使用非空类型。

请注意,当您在 Kotlin 中实现 Java 接口(interface)时,您可以选择是否将实现方法的参数声明为可空或非空。 IDE 将它们标记为可为空,因为它是安全的默认设置,但如果您需要,您可以将它们更改为非空。

关于kotlin - 扩展 Java 类时,在 Kotlin 中处理 null 情况的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021926/

相关文章:

string - 是否有正则表达式可以切换字符串中的字符大小写?

android - 如何清除回收站 View 中突出显示的项目?

java - 有没有办法重用一个可观察值,直到第二个可观察值在 zip 中得到 onComplete() ?

java - 由于没有窗口焦点,返回主 Activity 会导致 Dropping 事件

Kotlin:Upcast 和 sealed 类

kotlin - 从(现有的)Kotlin程序启动TornadoFX App

gradle - 添加项目依赖项时如何告诉Gradle从项目而不是源jar中获取源?

android - 当我使用 Jetpack Compose 时,如何以简单的方式在 Color.kt 中定义颜色?

kotlin - 在 Kotlin 中带有参数的单例

android - 延迟对 Kotlin 协程进行单元测试