《Kotlin核心编程》 ——1.3.2 更好的Java
1.3.2 更好的Java
如果你用Kotlin开发过业务,很快就会意识到它相较于Java的语法更加简洁、高效。比如Kotlin做了这些改良:
在很大程度上实现了类型推导,而Java在SE 10才支持了局部变量的推导。
放弃了static关键字,但又引入了object,可以直接用它来声明一个单例。而作为比较,Java则必须依靠构建所谓的“单例模式”才能等效表达。
引入了一些在Java中没有的“特殊类”,比如Data Classes(数据类)、Sealed Classes(密封类),我们可以构建更深程度上的代数数据类型,结合when表达式来使用。
但可能你会问,以上Kotlin的特性,Scala也有,能否可以说前者只是后者的一个子集呢?这种表述其实是不恰当的。其实,Kotlin在致力于成为更好的Java的道路上,不仅仅依靠这些新增的语言特性,它在兼容Java方面做了大量的工作,比Scala走得更远。
首先,从语言命名上就可以看出Kotlin在严格遵循Java的传统,它们都采用了岛屿的名字。
Java的名字来源于印度尼西亚瓜哇岛的英文名称,而Kotlin是俄罗斯圣彼得堡附近的一个岛屿的名字。
其次,虽然都是兼容Java,Scala(最近的几个版本)必须要求Java 8,而Kotlin则可以与Java 6一起工作,这也是后者在Android上更加流行的原因之一。
另外,Kotlin并没有像Scala那样在语法的探索上表现得“随心所欲”,Java程序员在学习Kotlin新语法特性的同时,依旧可以保留更多原有的习惯。举个例子,在Scala中,一切皆有类型。所以在大部分时间里,我们都用等号来定义一个Scala的函数。函数体最后一个表达式的值就是这个函数的返回类型。
def foo(x: Int) = {
val y = x + 2
x + y
}
没错,Scala舍弃了return关键字。在Kotlin中,它也引入了使用单行表达式来定义函数的语法,不需要用return来返回结果值。
fun foo(x: Int) = x * 2 + 2
然而,大部分情况下,我们还是可以采用类似Java的方式来定义一个函数,如:
fun foo(x: Int): Int {
val y = x * 2
return y + 2
}
由于Kotlin比Scala更加兼容Java的生态和语法,Java程序员可以更加容易地掌握它。同时,Kotlin非常注重语法的简洁表达。如果你了解Scala中的implicit,可能曾被这个Scala的语法惊吓到,因为它非常强大。然而,正如我们提到的,“简单灵活”的另一面意味着抽象和晦涩。Kotlin注重的是工程的实用性,所以它创造了扩展的语法,虽然相比implicit在功能上有损失,但显得更加具体直观,且依旧非常强大,可满足日常开发中绝大多数的需求。值得一提的是,Android则依靠这个Java所没有的特性,推出了扩展库android-ktx,我们在第7章将专门介绍这种强大的特性。
此外,Kotlin还新增了一些Java、Scala中没有的语法糖。如果你从事Android开发,那么肯定少不了在工程中写过如下的Java代码:
if(parentView instanceof ViewGroup){
((ViewGroup) parentView).addView(childView);
}
为了类型安全,我们不得不写两遍ViewGroup。然而在Kotlin中我们却可以直接这么写:
if(parentView is ViewGroup){
parentView.addView(childView)
}
这依靠的是Kotlin中的Smart Casts特性。我们不评价这种语法糖是好是坏,但它可以在一定程度上改善我们在工程开发中的体验。
总体而言,Kotlin旨在成为一门提升Java生产力的更好的编程语言,它拥有简洁的表达能力、强大的工具支持,同时至今仍然保持着非常快速的编译能力。相较而言,用Scala开发则常常受到编译过慢带来的困扰。
- 点赞
- 收藏
- 关注作者
评论(0)