使用Kotlin开发Android应用(I):简单介绍
使用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入门会更easy。
- 轻量级:相比其它编程语言,Kotlin函数库更小。因为Android存在65K方法数限制。这使得这一点更为重要。尽管使用proguard或者打包成多个dex能够解决问题,可是全部这些解决方式都会添加复杂性。并添加调试的时间。Kotlin函数库方法数小于7000个,相当于support-v4的大小。
- 高度可互操作:Kotlin能够和其它Java类库非常好的并且简单的互操作。Kotlin团队在开发这门新语言时正是秉承了这个中心思想。他们希望能够使用Kotlin继续开发现有的使用Java语言编程的project,而不是重写全部代码。因此Kotlin须要能够极好的和Java互操作。
- 完美的集成Android Studio以及Gradle:Kotlin有一个专门用于Android Studio的插件,以及还有一个专门用于Gradle的插件,因此在Androidproject中開始使用Kotlin并不困难(我将在下一篇文章中进行介绍)。
在你作不论什么决定之前我推荐先阅读一篇由Jake Wharton写的有趣的文章: hl=es&forcehl=1">在Android开发中使用Kotlin
Kotlin有些什么特性呢?
1. 表达式
使用Kotlin能够非常easy避免样板代码的编写。因为语言本身已经默认覆盖了大多数典型的情况。
比如。在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. 扩展函数
我们能够为不论什么类加入新函数。相比我们project中普遍存在的传统的工具类,扩展函数更具可读性。比如,我们能够为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公布了并包括了辅助构造函数。
- Androidproject中的jUnit測试:Android Studio 1.1引入的这个新特性Kotlin临时还不支持。
但纯粹的Kotlinproject能够全然支持Instrumentation測试和jUnit測试。
更新:Kotlin M12的gradle plugin如今支持Android Studio中的单元測试了。
总结
Kotlin是开发Android app中使用的Java语言的一个有趣的替换者。下一篇文章我们将描写叙述使用Kotlin怎样新建一个新project,并解说怎样充分利用Kotlin使Android开发更easy。敬请关注!
文末摄影鉴赏

使用Kotlin开发Android应用(I):简单介绍的更多相关文章
- 用Kotlin开发Android应用(I):介绍
关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...
- 用Kotlin开发Android应用(II):创建新项目
这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- 使用Kotlin开发Android
查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
随机推荐
- JNI与JNA性能比较
JNI与JNA性能比较 在介绍JNA时,提到了JNA是基于JNI的,是在JNI上封装了一层,JNI性能不如JNA.最近在网上看到篇简单的比较这两者性能的文档,感觉不错,现转载一下: 分别用JNI和JN ...
- IBatis——(一)
IBatis是持久层的框架,也就是我们说的Dao层框架,关注数据库操作以及和Java对象之间的关联,我们将这样的框架也称之为ORM(Object/Relaction Mapping)框架.而这里映射的 ...
- hdu 4750 Count The Pairs (2013南京网络赛)
n个点m条无向边的图,对于q个询问,每次查询点对间最小瓶颈路 >=f 的点对有多少. 最小瓶颈路显然在kruskal求得的MST上.而输入保证所有边权唯一,也就是说f[i][j]肯定唯一了. 拿 ...
- ionic安装
npm set registry http://registry.cnpmjs.org/ 设置淘宝镜像
- EasyUI时间格式化
changeDateFormatNodate: function (cellval) { var date = new Date(parseInt(cellval.replace("/Dat ...
- 2014年1月9日 Oracle 实用系统函数
1.空值处理 1.1 NVL(column/value,VALUE2) 与SQLSERVER的ISNULL相同 1.2 NVL2(column/value,Value2,Value3) 若参数1为空则 ...
- Ubuntu安装中文字体
Ubuntu没有宋体,楷体之类的中文字体,在Libreoffice中打不出中文,-_-! 我们可以从windows中借点字体过来,哈哈. 一.准备字体 从windows7中拷贝出字体文件,拷贝的目录为 ...
- 关于jQuery中的attr和data问题
今天在使用data获取属性并且赋值时遇到一个小问题,写下来防止以后再跳坑. 在使用jQuery获取自定义属性值时,我们习惯用 $(selector).attr('data-value'); jQuer ...
- Spring:启动项目时加载数据库数据(总结)
在项目中需要启动程序时,要将数据库的用户信息表加载到内存中,找到一下几种方式. 1.实现ApplicationListener接口,重写onApplicationEvent方法,可以在项目启动的时候执 ...
- css3实现一个div设置多张背景图片及background-image属性
CSS3/CSS1 background-image 属性 语法: background-image:<bg-image> [ , <bg-image> ]* <bg-i ...