第4条: 不要暴露需要推断的类型
Kotlin 的类型推断是 JVM 世界中最受欢迎的 Kotlin 特性之一。如此的受欢迎,以至于 Java 10 也引入了类型推断(不过与Kotlin相比是有限的)。虽然在使用这个特性的时候也有一些危险。最重要的是,我们需要记住赋值的隐式类型是右边的类型,而不是某些超类或接口:
这里 animal
是一个需要推断的类型。 在大多数情况下,这并不是一个问题,当推断的类型过于严格时,我们只需要指定它,问题就解决了:
但是,当这些类型是另外一个不受我们控制的库或者模块来提供时,就没上面的方案那样顺利了。在这种情况下,暴露了需要推断的类型可能非常危险,我们来看一个例子。
假设你有以下用于代表汽车工厂的接口:
如果没有其他参数,就使用默认的 Car
:
因为可能大部分工厂都会生成这个Car
,所以你把它设成了默认。 你省略了函数返回的类型,因为你定义了 DEFAULT_CAR
是一个 Car
类型,如下所示:
类似地,后来有人查看了 DEFAULT_CAR
并且发现可以通过下面语句来推断其类型:
现在,你们所有的工厂只能生产 Fiat126P
了,这可不是什么好事,如果你自己定义了这个接口,这个问题可能很快就被发现并轻松的解决。然而,如果它是对外 API 的一部分,你就有可能会先被愤怒的调用者找上门了。
除此之外,当我们遇到一些不太熟知的 API时, 返回类型是很重要的信息,所以为了可读性,我们也应该明确地指出其类型,特别是我们 API 上外部可见的部分。
总结
一般的规则是,如果我们不确定类型时,就应该指定它,这是很重要的讯息,我们不应该隐藏它(第 14 条:变量不清晰时,指定其类型)。此外,为了安全起见,在对外 API 中,我们应该始终指定类型。我们不能让它们因偶然而改变。推断的类型可能会有太多的限制,或者在我们项目的发展过程中太容易发生变化了。
Last updated