消息关闭
    暂无新消息!

1.1  Kotlin概述

    本节主要介绍了什么是Kotlin,以及Kotlin较Java到底有什么特别之处,足以让Google将其选为开发Android App的一级语言。

1.1.1  Kotlin是什么东东

     可能很多同学看到Kotlin这个词会感到很陌生,这很正常。就和2007年以前一样,在苹果推出iPhone以及相应的开发工具之前,Objective-C就鲜为人知,至少在国内是这样的。这里面提到的Objective-C是一种编程语言,而本书的主题是Kotlin,那么首先要回答的是,Kotlin到底是什么呢?没错,Kotlin和Objective-C一样,是一种编程语言。

    Kotlin是由JetBrains创建的基于JVM的编程语言,那么JetBrains又是什么呢?我相信很多Java程序员使用过IntelliJ IDE,这个号称最牛逼的Java IDE就是JetBrains的杰作,如果你没听过或没用过IntelliJ IDE也不要紧,相信阅读本书的同学或多或少都了解一些Android的知识,Android官方推荐的IDE是Android Studio,简称AS。这个IDE就是基于IntelliJ IDE社区版开发的。JetBrains旗下不只是有IntelliJ IDE一款产品,Kotlin也是JetBrains旗下的一款产品,一种编程语言。这种编程语言运行在JVM上。也就是Kotlin编译器会将Kotlin源代码编译成Java Byte Code,可以直接运行在JVM上。从这一点看出,在技术层面,Java和Kotlin是同一个级别的,都以Java Byte Code形式运行在JVM上。当然,Kotlin编译器还可以将Kotlin源代码编译生成JavaScript代码,以便在没有JVM的情况下运行。在未来,Kotlin编译器还可以将Kotlin源代码编译生成本地代码,完全脱离任何虚拟机运行,也就是说,Kotlin相对Java的优势之一是前者是多目标编译语言,而Java只能编译生成Java Byte Code(.class文件)。

1.1.2  为什么Kotlin突然火了

       尽管Kotlin已经推出有很长一段时间了,但并不怎么出名,这主要是因为JetBrains的名气没那么多,而且现在的编程语言实在太多了,所以Kotlin就像一块石头扔进了大海,不见了踪影。

那么为什么现在Kotlin突然火了呢?原因也很简单,Kotlin可以开发Android App,而且被Google看上了,同时,Google在2017年5月中旬的I/O Google大会上宣布,Kotlin成为开发Android App的一级语言,在Android Studio 3.0及以上版本中会支持用Kotlin语言开发Android App。这也就意味着,到现在为止,开发Android 本地App,可以使用Java和Kotlin两种编程语言。这就很像开发iOS App的场景了,可以使用Objective-C和Swift两种语言开发iOS App。因此,很多人把Kotlin比作Android世界的Swift。而且Kotlin和Swift的确都是很牛逼的编程语言,都加入了很多语法糖,可以大幅提高程序开发的效率。

1.1.3  Kotlin相对于Java有哪些优势

         可能很多同学会问,既然有了Java,为什么Google还要选择Kotlin来开发Android App呢?Kotlin相比Java有哪些优势呢?

在这一节我们来简单了解一下Kotlin的特点,通过这些特效,我们可以体会到Kotlin的优势所在。

➢     更容易学习:Kotlin是一门包含很多函数式编程思想的面向对象编程语言,而且相比Scala语言更容易学习。

➢     轻量级:相比其他编程语言,Kotlin函数库更小。由于Android存在65K方法数限制,这使得这一点更为重要。虽然使用proguard或者打包成多个dex能够解决这个问题,但是所有这些解决方案都会增加复杂性,并增加调试的时间。Kotlin函数库方法数小于7000个,相当于support-v4(Android1.6)的大小。

➢     高度可互操作:Kotlin可以和其他Java类库很好的并且简单的互操作。Kotlin团队在开发这门新语言时正是秉承了这个中心思想。他们希望可以使用Kotlin继续开发现有的使用Java语言编写的工程,而不是重写所有代码。因此Kotlin需要能够极好的和Java互操作。

➢     完美的集成Android Studio以及Gradle:Kotlin有一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件。而且即将推出的Android Studio3.0已经集成了Kotlin,因此在Android工程中开始使用Kotlin并不困难。

当然,Kotlin还有很多语法层面的特性,例如数据模型类、空类型安全、扩展函数等,这些技术将会逐渐在后面的章节中深入介绍。

1.1.4  Kotlin能做什么

      从前面的内容可以知道,Kotlin可以用来开发Android App,那么除了Android App,Kotlin还可以做什么呢?在本节我们就来一窥究竟。

1. 服务端开发

既然Kotlin是基于JVM的编程语言,那么自然而然就可以使用所有基于JVM的服务端框架,下面是几个Kotlin官方文档推荐的框架。

➢     Spring:一种开源框架,是为了解决企业应用程序开发复杂性而创建的。从Spring 5开始,Spring已经开始支持Kotlin的新特性了,并可以使用Spring在线生成器(https://start.spring.io)生成基于Kotlin的工程。

➢     Vert.x:用于建立基于JVM的响应式Web应用的框架

➢     Ktor:由JetBrains发布的一款基于Kotlin的本地Web框架

➢     kotlinx.html:是一种DSL,用于在Web应用中生成HTML。Kotlin服务端框架和kotlinx.html的关系就和JSP和FreeMarker的关系一样,FreeMarker是基于Java的模板引擎。使用FreeMarker,可以不依赖于HTML或其他技术,可以根据需要生成HTML或其他东西,也就是一种与具体渲染技术无关的技术

 

2. 以JavaScript方式运行

     Kotlin提供了生成JavaScript目标的能力,也就是将Kotlin代码直接转换为JavaScript代码。目前支持ECMAScript5.1标准,未来会支持ECMAScript 6。

    要注意的是如果将Kotlin代码转换为JavaScript代码,在Kotlin代码中只能包含Kotlin标准库,不能包含任何JDK API以及任何第三方的Java Library API,任何不属于Kotlin本身(Kotlin语句和标准库)的部分在转换的过程中将被忽略。

3.  开发Android App

     这一部分在前面已经介绍了,Kotlin和Java一样,都可以开发Android App,而且Kotlin和Java源代码文件可以在同一个工程中,可以联合进行调试。

尽管Kotlin能做很多事(Java能做的Kotlin都能做),但本书的主要关注点是开发Android App,因此,在本书后面的部分将着重介绍如何利用Kotlin开发Android App。

1.2  在线运行Kotlin代码

     可能有很多同学使用过Java或其他编程语言,学习这些技术的第一步,就是配置,一大堆的配置,这让很多初学者摸不着头脑,尤其是在没人指导的情况下更是如此。不过这一切在Kotlin这里就终结了,因为运行和测试Kotlin代码,根本就不需要进行配置,Kotlin官方提供了一个在线运行和测试Kotlin代码的环境,可以运行Kotlin语句和标准库。

为了进入在线测试页面,请在浏览器地址栏中输入https://try.kotlinlang.org,会进入下图1-1所示的页面。

 01

                                                                       图1-1  Kotlin的在线IDE

       在该页面左侧列出了一些例子,点击某个例子,会在右侧代码编辑区显示相应的代码,点击右上角的“Run”按钮,会执行Kotlin程序,在下面会显示执行结果。通过“Run”按钮前方的下拉列表框可以选择以JVM方式还是JavaScript方式运行,右下角可以选择当前代码对应的Kotlin版本,目前Kotlin的最高版本是1.1.2。

        可能很多同学已经按耐不住自己激动的心情了,打算编写一段Kotlin代码试一试,不过很可惜,自己连hello world都不知道怎么编写(只能运行在线IDE提供的Demo)。

      为了让这部分同学尽快上手,这款在线IDE提供了Convert from Java功能,也就是可以将Java代码转换为Kotlin代码。现在点击IDE右上角的“Convert from Java”按钮,会显示一个转换窗口,左侧需要输入Java代码,点击该窗口右下角的“Convert to Kotlin”按钮,会在窗口的右侧显示转换后的Kotlin代码。

现在我们来做个试验,首先准备一段Java代码,如下面的计算阶乘的代码。

Java代码:计算阶乘

public int jc(int n)
{
      if(n == 0 || n == 1)

      {
             return 1;
      }
      else
      {
             return n * jc(n - 1);
      }
}
public void main(String[] args) {

        System.out.println(jc(10));

}

 现在将这段Java代码录入到Convert from Java窗口左侧的文本框,然后点击右下角的“Convert to Kotlin”按钮,会将这段Java代码转换到Kotlin代码,并在窗口右侧的文本框显示Kotlin代码,如图1-2所示。

 02

                                                    图1-2  Java转换到Kotlin

最后将转换后的Kotlin代码复制到图1-1所示的代码区域,点击右上角的“Run”按钮,会执行这段代码,执行结果如图1-3所示。

03

图1-3  执行从Java转换的Kotlin代码

       要注意的是,并不是所有的Java代码都可以完美地转换为Kotlin代码,这只是个辅助功能,用于初学者平滑过渡到Kotlin。

     尽管我们现在还不了解如何编写Kotlin代码,但也可以在这个在线IDE中选择一些Examples,看一看执行结果。本书后面关于Kotlin的标准代码(不调用JDK和第三方Java API的Kotlin代码)都可以在这个在线IDE中运行。

1.4.6  在微信小程序中运行Kotlin程序

      从技术角度来说,Kotlin自然无法直接在小程序中运行了,不过由于Kotlin代码可以直接转换成JavaScript代码,也就意味着,从理论上来说,只要支持JavaScript的地方,就可以运行Kotlin。由于小程序使用了JavaScript语言开发,所以理所当然应该可以运行由Kotlin转过来的JavaScript代码,但需要稍微处理下。

     首先,这个kotlin.js文件就是个问题,最新的Kotlin版本中,kotlin.js文件的尺寸是1.3MB。这个尺寸用在Node.js中当然没问题,不过要用在小程序中,就有问题了。在老版本的小程序中,代码包被限制在1MB以内,尽管新版本小程序的代码包限制从1MB扩大到2MB,但1.3MB一个JavaScript文件还是有些大,而且用户安装这么大的程序包需要更多的时间,所以我们需要对kotlin.js文件进行压缩。大家不要误会,不是将kotlin.js文件压缩成zip、7z等格式的文件,而是从新整理kotlin.js文件的代码,把多余的字符(如空格、回车等)去掉,这样尽管kotlin.js文件的代码风格变得不友好(因为空格、换行等字符都没了),但尺寸会大幅度减小。反正kotlin.js是给计算机或手机执行的,又不是人看,代码风格也就无所谓了。

     用于压缩JavaScript文件的工具很多,例如YUI compressor就是一款很不错的JavaScript压缩工具,这款工具用Java编写。但我发现使用这款工具压缩kotlin.js文件会产生一些错误,无法成功压缩kotlin.js文件,因此,本节采用了另外一款在线压缩工具。现在进入如下页面。

https://jscompress.com

进入该页面,选择“Upload javascript Files”标签,将kotlin.js文件拖动到标签下方的区域,如图1-12所示。

 04

   图1-12  拖动kotlin.js文件开始压缩

       将kotlin.js文件拖动到指定区域后,点击“Compress”按钮开始压缩,由于kotlin.js文件比较大,所以需要等一会(可能是几十秒到几分钟不等)。压缩完成后,会切换到“Output”标签,会将压缩完的代码显示在“Output”标签中,如图1-13所示。也可以点击左下角的“Download”按钮下载压缩完后的.js文件。

05

图1-13  成功压缩kotlin.js文件

     从“Download”按钮右侧的提示可知,压缩后的kotlin.js文件尺寸是650.65KB(用大写的B更准确),压缩后文件的尺寸是原始文件的51.82%。从这一点来看,kotlin.js缩小了进一半。现在把压缩后的kotlin.js文件重新命名为kotlin_min.js。

     现在打开小程序IDE。机器上没安装小程序IDE的同学需要自行从下面的页面下载Windows或Mac OS X版本。这里不再详细介绍小程序的详细安装和开发过程。对小程序开发感兴趣的同学可以参考我写的《微信小程序开发入门精要》一书(https://item.jd.com/12186338.html)。

https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html

     用小程序IDE新建立一个工程,并将kotlin_min.js和kotlin_javascript.js文件复制到index目录中,如图1-14所示。

06

图1-14  小程序IDE

       虽然kotlin_min.js文件的尺寸kotlin.js文件的一半,但仍然有600多KB,小程序IDE在启动时需要对所有的源代码文件进行扫描,所以第一次启动可能会慢一点。

      现在还剩下最后一件事,就是在小程序中执行kotlin_javascript.js中的代码。

如果了解小程序背后的技术就会知道,小程序和Node.js有着千丝万缕的联系,至于那些联系,我会在我的个人博客(http://geekori.cn)中撰文描述,这里不再深入讲解。总之,Node.js的很多知识是可以直接用到小程序中的。例如,在小程序中,一个JavaScript文件要引用另外一个JavaScript文件,同样是使用require函数。在本例中,要让小程序运行kotlin_javascript.js中的代码,只需要在index.js文件的开始部分加上如下代码即可。

javascript代码

var kotlin = require('./kotlin_javascript.js');

     保存index.js文件后,小程序会自动运行(index.js是小程序首页对应的脚本文件)index.js的代码。调用require函数后,也会执行require函数参数指定的JavaScript脚本文件,因此,kotlin_javascript.js文件的整个代码都会被执行,和执行node kotlin_javascript.js命令的效果类似,只是小程序执行时会输出到小程序的Console中,效果如图1-15所示。

07

图1-15  在小程序Console中输出信息

        当然,到这里还不算完。如果读者从头开始看本章,会发现kotlin_javascript.js中实际上有两个函数:greeting和main,其中main是主函数,在main函数中调用了greeting函数。那么问题来了,在我们的JavaScript代码中,可否调用greeting函数呢?当然当然是Yes。不过仍然需要做一些处理。

首先,在小程序IDE中打开kotlin_javascript.js文件,在文件的最后加上如下的代码。

javascript代码

module.exports = {

  kj: kotlin_javascript

 }  

      这段代码的作用是将kotlin_javascript.js文件变成了一个模块,这样外部就可以引用该模块中的资源了。其中kotlin_javascript是在kotlin_javascript.js文件中定义的一个对象,利用这段代码,将该对象导出,对外的名字是kj,也就是外部程序可以通过kj访问这个对象。

那么在外部程序中,怎么引用kj对象呢?

    也许大家还记得,在前面使用require函数引用kotlin_javascript.js文件时曾将require函数的返回值赋给一个叫kotlin的变量,通过该变量就可以直接引用kj对象,也就是kotlin.kj。

也许后面的代码大家按着正常的思路就可以写出来,因为greeting是kj中的方法,不过调用会发现,greeting方法中的kj对象中并不叫greeting,那么叫什么呢?我们可以执行如下的代码看一下kj对象中的内容。

javascript代码

console.log(kotlin.kj);

     在Console中我们可以观察输出结果,如图1-16所示。很明显,在从Kotlin代码转换到JavaScript时,改变了greeting方法的名字。

08

图1-16  输出kj对象的信息

解决的方法有如下两个。

方法1:直接使用转换后的名字

新的方法名是greeting_61zpoe$,所以执行kotlin.kj.greeting_61zpoe$('Bill')即可调用原来的greeting方法。

方法2:修改kotlin_javascript.js文件中的代码

查看kotlin_javascript.js文件中的代码,会找到如下的代码行。

javascript代码

_.greeting_61zpoe$ = greeting;

 

将这行代码改成如下形式即可。

javascript代码

_.greeting = greeting

这样就可以使用kotlin.kj.greeting('Bill')调用greeting方法了。 

不管使用哪种方式调用greeting方法,执行结果都如图1-17所示。

09

图1-17  调用greeting方法的输出结果



0个评论

暂无评论!