由于存在大量潜在问题,Kotlin等优秀编程语言(如C#)没有检查型异常。为了让调用者知道可能发生的异常,应该用 throws 标签在函数的文档中定义它们。
8. 强制的 null 检查
在Java中,public方法的方法签名不会告诉你返回值是否为空。例如:
public List<Item> getSelectedItems()如果一条都没选会怎么样?这个方法是否返回null?还是返回空列表���如果不看方法的实现细节,我们就无法知道(除非这个方法有很好的javadoc描述了返回类型)。
这种情况下,开发人员可能会犯的两个错误是:
1.忘记检查返回值是否为空,导致著名的NullPointerException;
2.在返回值永远不可能为空的情况下检查了其是否为空,造成代码冗余。
Joshua Bloch 在第43条建议,用返回一个空的集合数组来取代返回null。这一条让我想到了可空和不可空类型。有了Kotlin的空安全性(null safety),你将知道返回值是否为空。
举个例子:一个返回类型List <Item>? 意味着它可以为null,而List <Item>则表示不能为null。如果它可以为空,编译器就会强制我们在访问其属性或调用其函数之前检查它是否为null。所以,更为强大的编译器将阻止开发者犯错误,生活突然变得容易了。
9. 没有原始类型(Raw types)
Java 1.5中引入了泛型,它们是实现类型安全的好方法。而为了向后兼容性,仍然可以使用原始类型,但Joshua Bloch在第23条中建议使用泛型(List <Integer>而不是List)以避免ClassCastExceptions。Kotlin不允许使用原始类型,因此必须为泛型指定类型参数,从而实现代码的类型安全。
总结
以上就是我认为《Effective Java》这本书影响了 Kotlin 设计的几处地方,肯定有遗漏,如果你有其它意见和建议,欢迎讨论。
原文:How “Effective Java” may have influenced the design of Kotlin
翻译:技术风向标