使用Kotlin开发Android应用(I):简介
Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进。
Java缺失的很多特性在最新的修订版中逐渐覆盖到了,但Android开发者暂时还没能够使用它们。这就使得类似Kotlin这样的语言有了用武之地了:在旧的开发环境中使用现代语言的特性。
Kotlin是什么?
Kotlin是由JetBrains创建的基于JVM的编程语言,IntelliJ正是JetBrains的杰作,而Android Studio是基于IntelliJ修改而来的。Kotlin是一门包含很多函数式编程思想的面向对象编程语言。
Kotlin生来就是为了弥补Java缺失的现代语言的特性,并极大的简化了代码,使得开发者可以编写尽量少的样板代码。
为什么要使用Kotlin?
首先我必须声明我使用Kotlin的时间并不长,我几乎是边学习边写这一系列博客的。我没有尝试其他替代语言例如Go或者Scala,因此如果你真的想要切换到另一门语言之前,我建议先搜索其他人是如何评价其他语言的。使用Scala开发Android的一个很棒的例子可以在47deg的Github上面找到。
下面是我为什么选择Kotlin进行学习的理由:
- 相对而言更快的学习曲线:例如相比Scala而言,我们将学得更快。Kotlin限制比较多,但如果你之前没有使用过现代编程语言,那么使用Kotlin入门会更容易。
- 轻量级:相比其他编程语言,Kotlin函数库更小。由于Android存在65K方法数限制,这使得这一点更为重要。虽然使用proguard或者打包成多个dex能够解决这个问题,但是所有这些解决方案都会增加复杂性,并增加调试的时间。Kotlin函数库方法数小于7000个,相当于support-v4的大小。
- 高度可互操作:Kotlin可以和其他Java类库很好的并且简单的互操作。Kotlin团队在开发这门新语言时正是秉承了这个中心思想。他们希望可以使用Kotlin继续开发现有的使用Java语言编程的工程,而不是重写所有代码。因此Kotlin需要能够极好的和Java互操作。
- 完美的集成Android Studio以及Gradle:Kotlin有一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件,因此在Android工程中开始使用Kotlin并不困难(我将在下一篇文章中进行介绍)。
在你作任何决定之前我推荐先阅读一篇由Jake Wharton写的有趣的文章:在Android开发中使用Kotlin
Kotlin有些什么特性呢?
1. 表达式
使用Kotlin可以很容易避免样板代码的编写,因为语言本身已经默认覆盖了大多数典型的情况。
例如,在Java中如果要创建一个典型的数据模型类,我们需要编写(或者至少生成)如下代码:
public class Artist {
private long id;
private String name;
private String url;
private String mbid;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMbid() {
return mbid;
}
public void setMbid(String mbid) {
this.mbid = mbid;
}
@Override public String toString() {
return "Artist{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
", mbid='" + mbid + '\'' +
'}';
}
}
如果使用Kotlin编写呢?如下所示:
data class Artist(
var id: Long,
var name: String,
var url: String,
var mbid: String)
2. 空类型安全
当我们使用Java进行开发时,大部分代码都是防守型的。我们需要在使用之前不断的检测对象是否为空,如果我们不想在代码运行时得到非预期的NullPointerException。类似其他很多编程语言,Kotlin是空类型安全的,因此我们需要使用安全调用操作符显式指明对象是否能够为空。
我们可以类似这样声明:
//This won´t compile. Artist can´t be null
var notNullArtist: Artist = null
//Artist can be null
var artist: Artist? = null
// Won´t compile, artist could be null and we need to deal with that
artist.print()
// Will print only if artist != null
artist?.print()
// Smart cast. We don´t need to use safe call operator if we previously checked nullity
if (artist != null) {
artist.print()
}
// Only use it when we are sure it´s not null. Will throw an exception otherwise.
artist!!.print()
// Use Elvis operator to give an alternative in case the object is null
val name = artist?.name ?: "empty"
3. 扩展函数
我们可以为任何类添加新函数。相比我们工程中普遍存在的传统的工具类,扩展函数更具可读性。例如,我们可以为fragments添加一个新函数,用于显示一个toast:
fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(getActivity(), message, duration).show()
}
然后可以这样调用:
fragment.toast("Hello world!")
4. 函数式支持(Lambdas)
每次当我们创建一个新的listener时,都需要声明一个onClick函数用于处理监听回调,我们可以直接编写监听回调的代码而不用声明onClick函数吗?答案是肯定的。这(包括其他很多有趣的功能)得归功与lambda表达式的运用:
view.setOnClickListener({ toast("Hello world!") })
目前的限制
译者注:本小节所列出的限制,在最新版的Kotlin中已经都解决了,仅供读者目睹Kotlin语言的完善和进化过程。
Kotlin目前还处于开发阶段,虽然已经很稳定而且最终release版本即将发布(这个夏天),但在Android开发中存在如下限制:
- 与自动生成代码的可互操作性:一些知名的依赖于自动生成代码的Android函数库,例如Dagger或者Butterknife,由于某些不兼容的命名,因此不能正常的使用。Kotlin团队正在解决这些问题,将来某一天将会解决(KT-6444)。不管怎么说,就像我将在下一篇文章中说明的,语言的可表达性能够说服我们不再需要这些函数库。
更新:在Kotlin M12已经带来了对注解处理的支持。
- 没有简单的方式声明自定义views:Kotlin类只能声明一个构造函数,而自定义views一般都有三个重载构造函数。当我们在代码中使用这些自定义views时只有一个构造函数不存在问题,但如果想在xml文件中使用自定义views,只有一个构造函数是不够的。最简单的解决方法是使用Java声明这些自定义views类,并在Kotlin中引用它们。Kotlin团队许诺将在M11发布版中解决这个问题。
更新:Kotlin M11发布了并包含了辅助构造函数。
- Android工程中的jUnit测试:Android Studio 1.1引入的这个新特性Kotlin暂时还不支持。但纯粹的Kotlin工程能够完全支持Instrumentation测试和jUnit测试。
更新:Kotlin M12的gradle plugin现在支持Android Studio中的单元测试了。
总结
Kotlin是开发Android app中使用的Java语言的一个有趣的替换者。下一篇文章我们将描述使用Kotlin如何新建一个新工程,并讲解如何充分利用Kotlin使Android开发更容易。敬请关注!
使用Kotlin开发Android应用(I):简介的更多相关文章
- 用Kotlin开发Android应用(II):创建新项目
这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...
- 用Kotlin开发Android应用(I):介绍
关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...
- 使用Kotlin开发Android应用(I):简单介绍
使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- 使用Kotlin开发Android应用 - 环境搭建 (1)
一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- 使用Kotlin开发Android
查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...
- 用Kotlin开发Android应用(IV):定制视图和Android扩展
原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...
随机推荐
- 在连接mysql数据库时出错:The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone
这个错误是时区导致的,所以需要在配置连接url后面加上时区: url=jdbc:mysql://localhost:3309/test?serverTimezone=UTC 其中UTC是统一标准世界时 ...
- Android中图片的三级缓存策略
在开发过程中,经常会碰到进行请求大量的网络图片的样例.假设处理的不好.非常easy造成oom.对于避免oom的方法,无非就是进行图片的压缩.及时的回收不用的图片.这些看似简单可是处理起来事实上涉及的知 ...
- 没有博士学位,照样玩转TensorFlow深度学习
教程 | 没有博士学位,照样玩转TensorFlow深度学习 机器之心2017-01-24 12:32:22 程序设计 谷歌 操作系统 阅读(362)评论(0) 选自Codelabs 机器之心编译 参 ...
- 关于Xilinx FPGA JTAG下载时菊花链路中的芯片数量
关于Xilinx FPGA JTAG下载时菊花链路中的芯片数量 emesjx | 2014-08-13 13:13:30 阅读:1793 发布文章 当一个系统中含有多片(2片以上)Xil ...
- 159. Find Minimum in Rotated Sorted Array 【medium】
159. Find Minimum in Rotated Sorted Array [medium] Suppose a sorted array is rotated at some pivot u ...
- oracle 插入记录,字段自动获取当前系统时间(YYYY-MM-DD HH24:MI:SS)
需求: 插入一条记录,要求自动获取当前日期,并且格式为(YYYY-MM-DD HH24:MI:SS) sql语句: insert into SY_COMM_CONFIG(CONF_ID, S_MTIM ...
- Razor 3、MVC 5
Razor 3 需要vs 2012 update 4 才可以 需要装一个 Microsoft ASP.NET and Web Tools 2013.1 才会有 MVC 5
- php 图片上传 文件上传 大小 限制
nginx 413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...
- 第一百八十一节,jQuery-UI,知问前端--自动补全 UI--邮箱自动补全
jQuery-UI,知问前端--自动补全 UI--邮箱自动补全 学习要点: 1.调用 autocomplete()方法 2.修改 autocomplete()样式 3.autocomplete()方法 ...
- python 类成员的修饰符
类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私有成员命名时,前两个字 ...