自从谷歌 I/O 2017宣布将支持 Kotlin 作为 Android 开发的 First-Class 语言,相信各位程序员的朋友圈都被Kotlin的消息轰炸了吧,支持Java的“守旧派”认为Java将稳坐霸主地位不动摇,支持Kotlin的“维新派”认为Kotlin很可能会把Java拉下马。其实,笔者认为新语言的出现对于程序员来说并不是一件新鲜事儿,程序员始终践行着“活到老,学到老”,真正能够对程序员产生影响的新语言的使用和性能。
易用性。
- 在语法糖的加持下,kotlin能够用更短的代码实现更多的功能。这是java 无法比拟的。所谓代码量越少,出bug的可能性就越低。
- kotlin特有的扩展属性,不再需要java工具类,对开发更加友好。
比如我们想实现字符串判空操作,在java中需要写一个StringUtil类,这样其他开发同学想实现该功能的时候,可能并不知道已经有人实现了该功能,存在重复造轮子的可能。通过扩展属性,我们可以很方便的看出String类都存在哪些方法。 - java中的bean类总是需要使用插件生成setter getter方法。kotlin中的data关键字可以解决这类问题,data类在编译期自动生成getter setter方法。
规范性。
工程项目都是需要指定开发规范的。比如变量命名等。在java中,方法重载的时候会生成@Override注解,但是这并不是强制约束的。kotlin的方法采用override关键字进行了强制约束。
再比如TODO。java中的TODO是以注释的形式存在,即使没有实现TODO处的代码,也没什么运行时问题。kotlin的TODO形式如下:
1 | fun main(args: Array<String>) { |
kotlin TODO的实现
1 | internal.InlineOnly . |
可以看到运行时会抛出异常。
思考:这里为什么不在编译期抛出异常呢?
安全性。
java中虽然有@Nullable @NotNull等注解。但是不会在编译期起作用,而是在运行期抛出异常。kotlin在声明变量的时候,可以指定变量是否为空,调用可为空对象时,需要进行空判断。
跨平台。
java在jvm的协助下虽然也是跨平台语言,但是不能像kotlin一样可以既可以编译成class字节码,又可以编译成js。
编译速度。
只有全量编译下,kotlin比java慢。增量编译下,两者几乎没有差距。
其他kotlin特性。
懒加载、高阶函数、协程、inline操作符、运算符重载、默认参数等。
GitHub 用户amitshekhariitbhu在GitHub上贴图分享了Java和Kotlin的语法区别,下面我们就一起来看一下吧!
打印日志
1 | // java |
1 | // Kotlin |
定义变量和常量
1 | // java |
1 | // Kotlin |
null声明
1 | // java |
1 | // kotlin |
空判断
1 | // java |
1 | // kotlin |
字符串拼接
1 | // java |
1 | // kotlin |
换行
1 | // java |
1 | // kotlin |
三元表达式
1 | // java |
1 | // kotlin |
操作符
1 | // java |
1 | val andResult = a and b; |
类型判断和转换(声明式)
1 | // java |
1 | // kotlin |
类型判断和转换(隐式)
1 | // java |
1 | // kotlin |
多重条件
1 | // java |
1 | // kotlin |
更灵活的case语句
1 | // java |
1 | // kotlin |
for循环
1 | // java |
1 | // kotlin |
更方便的集合操作
1 | // java |
1 | // kotlin |
遍历
1 | // java |
1 | // kotlin |
方法定义
1 | // java |
1 | fun doSomething() { |
带返回值的方法
1 | // java |
1 | fun getScore(): Int { |
无结束符号
1 | // java |
1 | fun getScore(value: Int): Int { |
constructor构造器
1 | // java |
1 | // kotlin |
Get Set构造器
1 | // java |
1 | // kotlin |
类方法
1 | // java |
1 | // kotlin |
枚举
1 | // java |
1 | // kotlin |
定义未初始化的对象
1 | // java |
1 | // kotlin |
排序
1 | // java |
1 | // kotlin |
匿名类
1 | // java |
1 | // kotlin |
初始化块
1 | // java |
1 | // kotlin |