- Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序
- (美)文卡特·苏布拉马尼亚姆
- 615字
- 2025-02-27 12:54:47
6.2.1 null是件不好的事
《Effective Java中文版(原书第3版)》[Blo18]建议,如果一个函数返回一个集合,但在运行时没有返回任何东西,那么我们应该返回一个空集合,而不是null。这是因为结果的接收端将失败,并且必须执行显式的null检查以避免问题。好建议。
如果函数的结果是对象而不是集合呢?Java中的传统解决方案是,如果没有任何可作为引用返回的内容,则返回null,最新的建议是返回Optional<T>。但是,这些解决方案也存在一些问题。
在Java中,不可能阻止程序员从期望返回引用的方法返回null。程序员必须选择使用Optional<T>,在何时何地使用它是令人困惑的事。另外,对于Optional<T>,为了避免null,会有额外的开销。
Kotlin可以安全、优雅﹑体面地处理这种情况。首先,将null赋值给不可空的引用,或者在引用类型不可空的情况下,返回null将导致编译错误。
下面这段代码会让Kotlin编译器发出抱怨:

在这种形式中,nickName()函数希望只对流行名"William"返回昵称,其他的则返回null。Kotlin说,没那么快。
Java中类似的代码可以编译,但会在运行时失败,但Kotlin不希望我们编写会崩溃的代码,至少不会那么容易。Kotlin不允许从方法中返回null,因为返回类型是String,它不可以为null。同样,它不允许我们将null作为参数传递,因为函数参数的类型也是String,不能为空。以下是编译器在发出抱怨:

一般来说,除非要与用Java编写的代码交互,否则要避免使用null和可空类型。但是,如果必须接收和/或返回null,那么你必须非常清楚地表明你的意图,以便Kotlin可以在编译时执行一些检查,以防止在运行时意外出现NullPointerException。接下来让我们关注如何获得null引用的编译时安全性。