Kotlin语言在谷歌的大力推动下,将来必然需要应用在工作中,虽然现在依然是Java主导,但在GitHub上已经有很多库采用了Kotlin来编写,也有很多新开发的APP用的是Kotlin,大厂也开始试水了,是时候让Kotlin成为我们成功的基石了。

1. 学习Koltin的必要性

在进入开发之前,我想先将学习Kotlin的必要性梳理一下。

目前在网络上对Kotlin的批判很多,常常能看到 《抛弃Java 改用 Kotlin 的六个月后,我后悔了》《从Java到Kotlin,然后又回到Java!》《Kotlin 并没有想的那么好》 等等,根据2018年调查显示1/4的Java开发者在迁移后表示后悔,详细调查报告名为The State of Kotlin 2018,该报告阐述了Koltin在2018年的情况。

但我本人认为,不论Kotlin目前的稳定性与健壮性如何,将来在Android开发中必然是有它的一席之地。甲骨文与谷歌的官司必然让谷歌不愿意看到自家的系统被他人握有把柄,openJdk不会是一个长久之计。作为一只不断学习进取的程序猿,学习Kotlin语言也是一条不错的路。

就目前来说,Kotlin还有许多不足,建议熟悉Kotlin语法教程后可以去看看 《Kotlin 的陷阱以及如何避免》 之类的文章。当然,一门语言的发展必然要踩许许多多的坑,Kotlin还很年轻,我们应该给它更多的宽容。而且Kotlin相较于Java还是有很多优点的,用Kotlin取缔Java的优缺点并存。

在我看来,学习并尝试使用Kotlin开发Android项目是很有必要的,但贸然使用Kotlin直接在老旧项目中取缔Java也许会导致比较严重的后果。我建议在老旧的项目中使用Kotlin还是需要多斟酌,而在新的项目中完全可以直接使用Kotlin,多观望Kotlin的更新情况,适时更新项目中使用的Kotlin版本,让你的项目和你一起成长。

2. 用Kotlin制作一个简单的APP

目前我只在AS中开发APP,本文中所用也是AS,建议使用Eclipse开发的童鞋尽早加入AS的大军。

2.1 用AS建立一个Kotlin Android项目

首先是需要建立一个新的项目,打开AS软件,并选择Start a new Android Studio project,如图所示:

新建项目
新建项目

随后将APP name、domain、location根据所需配置好,在底部将Include Kotlin Support勾选上,如图所示:

勾选Kotlin支持
勾选Kotlin支持

右下角点Next后,进入Target Android Device选择界面,这里根据所需配置好直接Next就好,如图所示:

Target Android Device选择
Target Android Device选择

接下来选择Add No Activity,不然AS直接就建立了一个可以直接运行的Hello World APP,我们还是体会一下建立Kotlin Activity的过程,如图所示:

选择Add No Activity
选择Add No Activity

Finish以后,等待AS建立一个新的项目并初始编译完成,我们就可以开始我们的第一个Kotlin APP的制作啦。

在Kotlin项目中,相对于Java的Android项目主要有两个区别:

  1. 项目目录下的build.gradle文件的buildscript
1
2
3
4
5
6
7
8
9
buildscript {
ext.kotlin_version = '1.3.41'
...
dependencies {
...
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
...
}
}
  1. app目录下的build.gradle文件的plugindependencies
1
2
3
4
5
6
7
8
9
...
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
...
dependencies {
...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
...
}

因此,在已有的Java Android项目中做出上述改动后,该项目也就可以用上Kotlin做开发啦,Kotlin和Java也可以很好的协同工作,当然,如果要这么做,请仔细斟酌并进行足够的测试。

2.2 添加一个Activity

在项目目录中,选中app/src/main/包名文件夹单击鼠标右键,在弹出菜单中选中New菜单,接着在弹出菜单中选中Activity菜单,最后在弹出菜单中选中Empty Activity单击鼠标左键,如图所示:

选择Empty Activity
选择Empty Activity

AS将弹出一个Activity的配置对话框,将各个属性配置好,注意由于项目中没有启动的第一个Activity,所以要勾选Launcher Activity,同时注意Source Language的选项要是Kotlin,如图所示:

配置Activity
配置Activity

点击Finish后,AS会建立相应的layout和kt文件,kt文件就相当于java文件。现在这个新的Activity还是一个空白的页面,我们可以给它加一个TextView,给它设置内容,看看Kotlin与Java的不同之处。

layout与之前还是一样的,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>

</FrameLayout>

Kotlin的不同还是比较多的,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
text_view.text = "Hello World !"
}
}

这样一个Hello World的TextView就可以显示在界面中了,run一遍看看效果和Java的没什么区别。简单看一下kt文件我们可以看到一些和Java的区别:

  1. 导入了一个kotlinx.android.synthetic.main.activity_main.*,这个import可以让layout中的控件可以直接用id来调用,省略了findViewById()这一个步骤。

  2. Kotlin去掉了语句末尾的;,让少写了’;’而导致编译失败的问题从此消失。

  3. 继承关系直接用:表示,接口的实现也是用的:表示,似乎在精简代码的同时让人有点迷糊。

  4. override变成了一个修饰语,不再是注解的形式。

  5. 变量的表示使用了变量名: 类名的形式,?代表了此变量可以为空,空安全也是Kotlin的主打特点。

  6. 对象的属性看上去可以直接操作,实际是来自get()/set(),似乎在精简代码的同时让人感觉增加了耦合性。

当然区别不止这几点,只是在一个最简单的APP中都存在的上述几点区别,可以看出一些Kotlin的设计理念,应该旨在解决一些Java过于冗杂和不太安全的问题。