Google IO 2017宣布了 Kotlin 会成为 Android 官方开发语言。本文尝试从一个客观全面一点儿的角度来看待这件事情,尽力为大家提供一个比较理性的观点供参考。
关于 Google 为什么会选择 Kotlin,我认为有两方面的原因。
为了逐渐摆脱专利流氓Oracle。从去年的转向OpenJDK,到现在的支持Kotlin作为官方语言,某种意义是为了摆脱藉由9行代码敲诈获取天价赔偿的oracle。
选用Kotlin,实至名归,这个荣誉它值得拥有。Kotlin确实以其实用,高效赢得了海外很多公司和开发者的认可,比如Square的Jake大神一直在推Kotlin。Kotlin在国外至少有将近2年的应用生产环境的实践(非JetBrains内部实践应用)。在移动开发中,相比iOS程序员,Android程序员总是很幸运,因为我们有很多优秀好用的工具(Android Studio等),选用Kotlin,则是Google 为开发者提供高效的开发工具的一贯作风。
Kotlin的有很多特点,比如简洁,安全实用,开发效率高和提升可读性,更好的函数式编程支持。
1.简洁,Kotlin的代码确实比Java更加简洁,比如类型推断,省去结尾的分号等等,然而这远不能成为我们改用Kotlin的原因。
2.安全,这是Kotlin的一个很重要的特性。Kotlin是空指针安全的,JetBrains做了一件很聪明的事情,它们将运行时才能空指针的检测提前到了编译时,主要方式是增加了Any?这种可为空的类型,使用Kotlin之后,我们程序的空指针会得到明显的改善。
3.实用,高效率。Kotlin的实用具体表现在
4.Kotlin引入了Lambda,Streams API 和函数式编程支持。
5.可读性 从客观上,Kotlin语法和特性上让代码更加具有描述性而已。但是不得不指出代码可读性主要依赖编写者的编码素质和能力。
对我个人而言,高阶函数和方法扩展这两个特点着实真心受用。方法扩展会让我有一种创造感,这是Java种的Util方法所无法比拟的。
这个很难说,因为这个世界上并不是一件事物好,就会必然得到广泛应用的。一件事物的推广开来靠的是一群人,但阻力也往往也来自一群人,只不过和前者不是相同人群。
从个人主观来看这个问题,我更加愿意看到这种现象发生。原因并不是因为我更喜欢Kotlin,而是在于我更愿意看到事物在进步,在变得优秀,所以即便某一天Kotlin被更加优秀的语言取代,我也是很欢迎的。
Kotlin适用于多个平台,并没有对学习者做限制。任何有学习意愿的人都可以习得这门语言。
但是考虑到国内 Kotlin 资源不够丰富,网络不够畅通等问题,所以导致了很多人变成了吃瓜群众进行观望。
然而,对于一个项目和团队来说,总需要有第一个人先来推进。而且这个推进过程并非顺利,这其中包括
上述推进 Kotlin 观点部分参考自Life is Great and Everything Will Be Ok, Kotlin is Here (Google I/O ‘17) 中 Christina Lee(Pinterest Software Engineer,国外 Kotlin 美女布道师之一)的分享内容。
虽然 Kotlin 很优秀,但是推动在项目中推动 Kotlin 应用并非易事,因为这对于新事物来说在正常不过了,就像明治维新一样看起来很光鲜,成功,但是它的变革进程并非顺利,先是血雨腥风的倒幕运动,再到明治六年爆发的标志武士时代结束的西南战争,经过数十年的努力才算取得成功。
因此关于哪些人适合率先应用 Kotlin,我认为需要具备以下几点
目前想到了一些关于 Kotlin 应用在项目中的一些顾虑。这些顾虑目前并非全面,但是提出来,希望大家可以规避和改善。
1.写出来的代码并不是 Kotlin style。解决这个问题,还是需要多学习和思考
2.扩展方法的滥用,Kotlin 的扩展方法很好,我们可以扩展很多方法,弥补Framework的一些不完善,但是扩展时我们需要谨慎,一定要把合适的方法放到合适的类型上,不可为了简单增加不符合某些类不应该具备的职责。 具体需要最好以下两点
Kotlin出来之后,听到了两种不同的声音:
出现以上两种不同的声音,不得不引起我们对于 Android 程序员的核心竞争力的思考。那么到底什么才是 Android 程序员的核心竞争力呢?
Android程序员和其他程序员甚至其他职业并无二致,我认为这种竞争力表现在解决问题的能力。想要具备这种能力,极其依赖我们对问题和技术的准确认识和扎实的基础。
编程语言本质上还是工具,好的工具能带来更好的效果,但是如何运用好,将效率和质量提升到最高,则还是更主要的依赖于开发者的能力。
选用好的工具,更侧重夯实基础和加强对事物本质认识的能力,我想这样才能让我们的竞争力更强。
总结而言,Kotlin是一个更好的工具,没有它,并不影响我们日常的 Android 开发工作。但是我还是建议开发者和团队去尝试这种语言,抓住这个近在咫尺的小确幸。
没错,Kotlin是有很多很多的语法糖。有必要简单普及一下语法糖的概念(如下摘自维基百科)
In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. It makes the language “sweeter” for human use: things can be expressed more clearly, more concisely, or in an alternative style that some may prefer.
由定义可知,语法糖的目的就是让代码更简单,更可读。
决定Kotlin使用这么多语法糖的除了简洁,高效可读之外,还有一个原因,是因为kotlin编译生成的class文件是目标到JVM 6(基于JVM 6 是一种权衡后的结果),比如我们在Kotlin中使用了Lambda,它是不可能编译成invokedynamic指令的,因为那样会导致在JVM6上根本无法识别,所以经常通过翻译成内部类的形式来实现。
使用语法糖又能怎样,它的目的是好的,毕竟它真真实实介绍了开发人员的代码量。
Kotlin是一门实用语言,这是它的基因,它不是学术语言,它的目标是减轻开发者的负担。它很适合 Android,因为大多数的 Android 的程序员是做工程。
Kotlin,是基于JVM的编程语言,但是基于JVM的编程语言并没有什么不好。(J)VM的出现无非也是一种平衡的结果。在牺牲部分执行效率的前提下,提供了一定的抽象,加快了开发者的效率。这种tradeoff其实更加有利于人的一侧,这也是编程语言发展的趋势和目标
Kotlin 在国内推广应用的道路可谓是 漫漫而修远兮。因此更需要真正实践,去踩坑的人开始on board,去出产更多的真正能推动 Kotlin 应用的文章,分享等这些有实质性意义的行动。
Kotlin 非常适合开发 android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制:
Kotlin 已被一些大公司成功采用,其中一些公司分享了他们的经验:
最后附上《Kotlin for Android Developers》这本学习使用Kotlin开发Android应用的指南。
在开始学习使用Kotlin开发Android应用之前,我们首先需要准备好手中的环境,那就是必须先配置好Android Studio 3.0的环境。
这里的工程创建与普通的Android应用工程创建并无不同,唯一的不同之处在于创建工程时勾选 Include Kotlin support 选项。如图:
在默认创建好的Activity中便已经是Kotlin的代码,看起来与Java代码本身非常相似:
Kotlin文件以.kt结尾。
默认创建好的Kotlin文件还是会放在和Java文件一样的位置,如果需要使kotlin文件与Java文件分开放的话,那么可以在对应的gradle文件中加入以下配置:
android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
这样的话,所有默认创建的Kotlin文件就会被放在/kotlin/目录下了。
如果需要在已有的工程中添加Kotlin的支持,那么只需要在新创建Activity时在Source language选项中选择Kotlin就可以:
在Android Studio 3.0中提供了可以将Java代码转化为Kotlin代码的工具。使用时只需要将对应的Java文件打开,然后选择菜单栏上的 Code -> Convert Java File to Kotlin File 就可以完成转换。
不过需要注意的是,这个工具可以完成大部分的语法转换,个别类型,比如数组在转换的时候可能有些问题,需要自己手动调整。博主我在练习的时候发现了这个问题,不过通过语法文档迅速做了修正。发现Kotlin在语法简洁方面确实要优于Java很多。例如下面一段代码:
val bitmaps = LargePicLoadHelper.cutItemImage(cutImage, itemImageHeight)
cutImage.recycle()
for (i in bitmaps) {
val imageView = ImageView(this)
imageView.setImageBitmap(i)
linearLayout.addView(imageView)
}
textView.postDelayed({
for (i in bitmaps) {
i.recycle()
}
}, 1000)
这段代码在轮询数组时,比Java的foreach循环要简洁很多,i在这里代表了一个Bitmap对象,bitmaps是一个数组。是不是很简单呢?
Kotlin提供了很强大的互操作性,这个互操作性是个什么鬼呢?就是说Kotlin可以很方便的调用Java代码,Java代码也可以很方便的调用Kotlin代码。这个方便到什么程度呢?Kotlin可以直接调用Java代码。如果你了解JNI的话,那就知道Kotlin的互操作性有多么简洁多么方便了。
使用Kotlin声明Activity:
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity)
}
}
使用Kotlin设置点击事件:
val textView = findViewById(R.id.text) as TextView
textView.setOnClickListener {
Toast.makeText(this,"Hello Kotlin!",Toast.LENGTH_SHORT).show()
}
看到没有,上面的setContentView以及下面的Toast就是Android提供的API,我们可以直接使用。并且setOnClickListener方法内部并不需要new OnClickListener对象!直接写点击实现就可以了!还有Toast的第一个参数this在Java中是一定要写Activity.this的,而这里只用写this就可以了!