今年TIOBE榜单评选年度编程语言,Kotlin成为竞争的热门,作为Android开发的主要语言之一,Android开发者应该感到开心。虽然Kotlin基于Java,但是我们总算可以不再和Java开发混为一谈(不过,如果是Web开发,Kotlin也支持,就看你用不用XD)。
从Google宣布Kotlin成为Android的开发语言,我就通过Kotlin官方文档进行了学习了,也写过几篇文章,着重说明了一些个人认为比较有用的语法。在后来的开发中,Java和Kotlin交叉使用在不同的项目中,今天就来谈谈自己在使用Kotlin进行Android开发时的感受。
Kotlin能够与Java完美融合,这为Kotlin增加了很多的人气,使用Kotlin不需要任何配置就可以使用Java的代码和类库,不必担心没有好用的第三方类库,Java的类库都可以为你所用;而借助于Kotlin的类扩展,它还为我们提供了更加方便的接口,例如,使用Kotlin中的String,我们直接就拥有了String.isNullOrEmpty()方法,无需使用任何第三方类库。
Kotlin提供了可选值,如果引用可能为null,我们就不得不把变量类型定义为可选的,否则我们无法给变量赋值null。这里暗示我们,定义变量类型前,我们需要认真考虑这个变量有没有可能为null。但是,这不是可选值的所有优点,我们在使用可选值的时候,有!!和?两个符号可供使用,使用!!就代表我们很确信这个值在使用的位置不为null,如果代码出现bug,在我们确信不能为null的位置就会抛出NullPointerException;如果使用?,则我们在这里不是必须使用这个变量,只是尝试使用,如果不为null,就使用,否则不使用。在Java中,我们不得不寄希望于程序员的水平,是否对引用判空完全是个人的自觉行为,Kotlin在语法上对你的行为作出了限制,让你在使用可选值时候不得不去思考使用!!还是?。
Kotlin提供了数据类(data class),我常用它来定义实体类,而且Kotlin不会限制一个文件中只能存在一个类定义,我们可以把相关的实体类放在一个文件中。数据类的定义更简单,编码成本更低。另外,在使用EventBus时,我们需要定义自己的Event类,使用Kotlin代码只需要短短几行。
kotlin-extension为我们提供了更好的操作View的方式,我们再也不需要写大量的findViewById,很早以前,我就觉得findViewById是重复的冗余代码,但是我们还不得不一遍又一遍得写下去,现在总算解脱了。
Java做一个单实例模式需要考虑很多问题,但是Kotlin不同了,只需要使用object替换class就可以定义一个安全的单实例。
上面是我使用Kotlin时候深刻体会到的优点,但是,不得不承认,Kotlin,也存在一些不足,至少是我在使用中发现的一些不方便之处。下面就来说说。
首先,Kotlin写出的代码给人感觉比较松散,可能由于Kotlin的语法语义含义比较多,直白点的说法就是Kotlin一行代码能做的事情可能需要很多行Java代码。这个严格意义上可能也不能算是缺点,但是当我们在查找bug时,可能会有一些阻碍,一条语句做了太多的事情,我们需要去想想bug是执行到这条语句的什么阶段发生的,可能需要我们调整参数或者使用粒度更细的语法。
其次,Kotlin不强制检查异常。我觉得这是Kotlin相比于java的倒退,个人感觉甚至于是Kotlin的作者对Effective Java书中内容的曲解?网上也有不上相关的文章,大家可以去看看,如果了解C#的,应该知道C#也是不强制捕获异常的,还有不少关于C#和Java在这方面的讨论。下面说说我的看法。Effective Java中建议我们要注意捕获Java中的异常,捕获方式要恰当,不要随便忽略,异常抛出,我们就要有适当的处理。也就是说,抛出异常需要检查是应该的,而且我们不要将所有异常都想当然的catch然后打印。而使用Kotlin不会强制捕获异常,我就不止一次掉坑,尤其是在使用一些平台相关资源时,APP在不同厂商手机上行为不同。这些地方SDK往往会抛出异常,如果是Java代码,强制捕获异常,我们会注意到这里可能有坑,但是使用Kotlin,我们完全没有去检查坑的意识。不是所有的API都会抛异常,我们也不可能对所有调用的API去查看API文档,确定是否会抛出异常。带来的结果就是,我们无法测试市面上所有机型的手机是否运行良好。所以,我们使用Kotlin要格外注意一些异常捕获的问题。
总的来说,Kotlin的优点还是多于缺点,可以说是瑕不掩瑜,在以后的开发中,有机会大家可以尝试使用。可能还会有不同的看法和理解。Google既然将其设置为一级开发语言,必有其道理,我们应当试着去适应和接纳新的东西,跟上Google的步伐。
![](https://img-my.csdn.net/uploads/201612/08/1481201471_6133.png)