《Kotlin核心编程》 ——1.3.2 更好的Java

举报
华章计算机 发表于 2020/02/21 20:04:44 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第1章,第1.3.2节,作者是水滴技术团队 。

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开发则常常受到编译过慢带来的困扰。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。