关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿。不过,我还是想跟进它们、翻译它们,以锻炼自己的英文翻译。各位高手发现问题,请及时“拍砖”。

原文题目:Kotlin for Android (I): Introduction(http://antonioleiva.com/kotlin-for-android-introduction/

原文作者:Antonio Leiva(http://antonioleiva.com/about/

原文发布:2015-03-09

Kotlin是众多基于JVM的编程语言之一。在Android开发中,它可能成为Java继承者。Java是世界上最常用的语言之一,当很多其他编程语言为了更加方便程序员使用在不断发展时,Java却没有能够像预期那样及时跟上。

Java的很多不足之处,都在最新的修订版得以修复了,但是Android开发者暂时还使用不到它们。这是使用Kotlin和类似语言的吸引力:在目前的开发环境下使用先进的编程技术。

Kotlin是什么?

Kotlin是由JetBrains(https://www.jetbrains.com/)创建的基于JVM的编程语言,IntelliJ也是JetBrains团队的,而Android Studio又是基于IntelliJ而来的。它是包括很多函数式编程思想的面向对象编程语言

Kotlin正是为弥补Java那些缺憾而生的。它极大简化代码,使我们节省编写大量的样板代码工作。

为什么要使用Kotlin?

首先,我申明我使用Kotlin的时间不长,我几乎是一边学习,一边写这些文章。我还没有试过其他语言,如:GO或Scala,所以你如果真的想换其他语言,我建议你先搜索其他人是如何评价你要转换编程语言。可以在Github的47deg项目(http://47deg.github.io/translate-bubble-android/)中找到使用Scala语言开发Android应用的好例子。

这些是我为什么选择Kotlin学习研究的原因:

  • 相对快速地学习曲线(路径):与Scala实例相比,我们进入更简洁领域。Kotlin虽有很多限制,但是即使你之前从未使用过现代语言,从它起步也很容易。
  • 轻量级:Kotlin代码库比其他语言的都小。这点很重要。因为Android方法的限制总是一个问题,尽管有其它解决方案(如:proguard或multidexing),但是所有这些解决方案都很复杂,在调试时很费时。Kotlin增加的方法少于7000个,与support-v4差不多。
  • 可互操作性高:它能够很好地与其它Java代码库一起运行,而且互操作非常简单。这是Kotlin团队开发新语言时牢记的主要观点之一。他们希望用它来继续开发目前用Java开发的项目,而不需要重写整个代码。所以Kotlin需要与Java代码有极佳地可互操作性。
  • 完美地与Android Studio和Gradle集成:我们有IDE插件和Gradle插件,这样用Kotlin开发Android项目没有困难(我将在下一篇文章中讨论)。
  • 在做决定之前,我建议先阅读Jake Wharton所著《使用Kotlin进行android开发》(https://docs.google.com/document/d/1ReS3ep-hjxWA8kZi0YqDbEhCqTt29hG8P44aA9W0DM8/edit?hl=es&forcehl=1)文章。这是一篇令人关注的文章。

从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,在使用之前,要不断的检测对象是否为空。与许多其它语言一样,因为需要使用安全调用运算符显式指明对象是否能够为空(null),所以Kotlin是空类型安全的(http://kotlinlang.org/docs/reference/null-safety.html)。

可以这样做:

 //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、扩展函数

可以为任何类添加新函数。在项目中,替代已有的典型实用程序类可使代码更具可读性。例如,为fragment添加新函数,用于显示toast:

 fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(getActivity(), message, duration).show()
}

现在可以这样做:

 fragment.toast("Hello world!")

4、函数式支持(Lambdas)

如果不想在每次声明点击操作应该做什么时创建一个新listener,可以直接定义想要做什么吗?答案是肯定的。这(包括许多更有趣的功能)都归功与Lambda表达式的运用:

 view.setOnClickListener({ toast("Hello world!") })

目前的限制

尽管Kotlin十分稳定并且很快(今年夏天)就要发布最终版本,但是它仍然在开发中,用于android应用开发还有一些限制:

  • 与autogenerated code的互操作性:有些知名的Android库,如:Dagger或Butterknife,它们依赖autogenerated code,由于有些命名不兼容,而不能工作。Kotlin团队在处理此问题,有一天会解决的(KT-6444:https://youtrack.jetbrains.com/issue/KT-6444)。不管怎样,如我在下一篇文章中说明的,语言表达能力可使我们认为不需要那些库。

更新:现在Kotlin M12引入支持注释处理。

  • 自定义视图声明方法不够简单:Kotlin类仅能声明一个构造函数,而自定义视图通常需要三个。如果使用类编程方式,这不是一个问题,但是XML用法就不够了。最简易的变通方式是在Java中声明这些类,而后在Kotlin中使用它们。Kotlin团队承诺在M11版本中解决(https://youtrack.jetbrains.com/issue/KT-2095)。

更新:Kotlin M11发布了,并包括辅助构造函数http://kotlinlang.org/docs/reference/classes.html#constructors)。

  • Android项目的JUnit测试:在Kotlin中,Android Studio 1.1的新增特性还可能使用。顺便说一下,在纯Kotlin项目中,Instrumentation测试和JUnit测试是全功能的。

更新:Kotlin M12 Gradle插件现在可以用于单元测试了

总结

对于开发Android APP,Kotlin是令人关注的Java替代者。下篇文章将说明怎样用Kotlin新建一个新项目,以及怎样发挥语言特色,使Android开发更容易。敬请关注!

用Kotlin开发Android应用(I):介绍的更多相关文章

  1. 使用Kotlin开发Android应用(I):简单介绍

    使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...

  2. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  3. 使用Kotlin开发Android应用(II):创建新工程

    在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...

  4. 使用Kotlin开发Android

    查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...

  5. 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数

    本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...

  6. 让你的代码量减少3倍!使用kotlin开发Android(一)

    让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...

  7. 使用Kotlin开发Android应用 - 环境搭建 (1)

    一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...

  8. 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密

    上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...

  9. 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean

    回顾一下 哈,没想到你已经坚持不懈看到第三篇了,不错哈~坚持就是胜利. 本文同步自博主的私人博客wing的地方酒馆 在上一篇文章中,我们介绍了扩展函数,这里对上一篇进行一点小小的补充. 还记得text ...

随机推荐

  1. matlab 循环读入多个mat文件组合成一个mat文件

    今天做实验,需要到这个功能,在朋友的告知下,写了代码,在此留个标记 clc clear load('F:\效果对比\colorhist\1.mat'); a=ans; a=a'; : filename ...

  2. 《ES6基础教程》之 Call 方法和 Apply 方法

    <script type="text/javascript"> // Call方法: // 语法:call(thisObj[,arg1,arg2,...,argN]) ...

  3. 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)

    上一节我们介绍了 VXLAN 的基本概念,今天介绍如何在 ML2 中启用 VXLAN. 在 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 vxlan network ...

  4. DOM-Document类型

    Document类型 JavaScript通过Document类型表示文档.在浏览器中,document对象是HTMLDocument(继承自Document类型)的一个实例,document对象是w ...

  5. 如何装出高逼格的64位win7系统

    自从有了ghost这个玩艺儿,装系统就不再是什么技术活了,但是一直崇尚纯净.原生.DIY的挨踢男来说,这种千篇一律的系统从来都不是他们想要的.为了榨干硬件的每一滴性能,发挥软件的最大效果,他们喜欢折腾 ...

  6. Oracle启动报错ORA-27102解决

    环境:RHEL5.5 + Oracle 10.2.0.4 此错误一般是因为数据库的初始化参数文件的内存设置不当导致.本例是因为操作系统参数设置问题导致. 当前现象:Oracle启动报错ORA-2710 ...

  7. 记录一则数据库连接故障ORA-12560,ORA-12518

    环境:Win Server 2008 R2 + Oracle 11.2.0.1 故障:客户反映数据库连接不上,本机sysdba和网络连接都连接不上. 一.确认故障 1.1 服务器尝试sysdba登录 ...

  8. 导入android-support-v4.jar的方法

    在导入使用了ViewPage,ActionBar,Fragment的工程后出现错误,很有可能是没有导入4.0版本的支持包. 正确导入方法为: 首先在Project->properties-> ...

  9. PHP中的魔术方法(2)

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  10. 【Kylin实战】Hive复杂数据类型与视图

    1. 引言 在分析广告日志时,会有这样的多维分析需求: 曝光.点击用户分别有多少? 标签能覆盖多少广告用户? 各个标签(标注)类别能覆盖的曝光.点击在各个DSP上所覆盖的用户数 -- 广告数据与标签数 ...