Kotlin

关于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中,如果要创建一个典型的数据类,就需要写(或至少产生)这样代码:

 1 public class Artist {
 2     private long id;
 3     private String name;
 4     private String url;
 5     private String mbid;
 6
 7     public long getId() {
 8         return id;
 9     }
10
11     public void setId(long id) {
12         this.id = id;
13     }
14
15     public String getName() {
16         return name;
17     }
18
19     public void setName(String name) {
20         this.name = name;
21     }
22
23     public String getUrl() {
24         return url;
25     }
26
27     public void setUrl(String url) {
28         this.url = url;
29     }
30
31     public String getMbid() {
32         return mbid;
33     }
34
35     public void setMbid(String mbid) {
36         this.mbid = mbid;
37     }
38
39     @Override public String toString() {
40         return "Artist{" +
41                 "id=" + id +
42                 ", name=‘" + name + ‘\‘‘ +
43                 ", url=‘" + url + ‘\‘‘ +
44                 ", mbid=‘" + mbid + ‘\‘‘ +
45                 ‘}‘;
46     }
47 }

用Kotlin需要多少代码?数据类就这么简单:

1 data class Artist(
2     var id: Long,
3     var name: String,
4     var url: String,
5     var mbid: String)

2、空类型安全

在用Java开发时,大多数代码都是预防性的。为了不遇到非预期的NullPointerException,在使用之前,要不断的检测对象是否为空。与许多其它语言一样,因为需要使用安全调用运算符显式指明对象是否能够为空(null),所以Kotlin是空类型安全的(http://kotlinlang.org/docs/reference/null-safety.html)。

可以这样做:

 1 //This won´t compile. Artist can´t be null
 2 var notNullArtist: Artist = null
 3
 4 //Artist can be null
 5 var artist: Artist? = null
 6
 7 // Won´t compile, artist could be null and we need to deal with that
 8 artist.print()
 9
10 // Will print only if artist != null
11 artist?.print()
12
13 // Smart cast. We don´t need to use safe call operator if we previously checked nullity
14 if (artist != null) {
15     artist.print()
16 }
17
18 // Only use it when we are sure it´s not null. Will throw an exception otherwise.
19 artist!!.print()
20
21 // Use Elvis operator to give an alternative in case the object is null
22 val name = artist?.name ?: "empty"

3、扩展函数

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

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

现在可以这样做:

1 fragment.toast("Hello world!")

4、函数式支持(Lambdas)

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

1 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开发更容易。敬请关注!

时间: 2024-10-31 12:41:14

Kotlin的相关文章

android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码

Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 实现可以滑动文字逐渐变色的TabLayout android实现将app隐藏加密功能的源码 android实现横向滚动的卡片堆叠布局 android仿支付宝的咻咻动画源码 android状态栏和沉浸式导航栏管理源码 Android优质博客 从BaseActivity与BaseFragment的封装谈起 这篇博客主要是从

即刻开始使用Kotlin开发Android的12个原因(KAD 30)

作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们是非常实用的.今天我想谈谈为什么我认为学习Kotlin是非常有趣的. 虽然, Kotlin现在已是官方支持的开发Android APP的编程语言,而你仍可能觉得没有足够的理由进行改变.在这些年以来,Java已经证明其能力,为什么要改变? 这是我认为转换到Kotlin不是一个冒险的赌注,而是你可以做的

Kotlin的android扩展:对findViewById说再见(KAD 04)

作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使用findViewById编写Android视图.或是你可能放弃它转而使用著名的Butterknife库.那么你将会喜爱Kotlin的Android扩展. Kotlin的Android扩展 Kotlin的Android扩展是Kotlin插件的正规插件之一,它无缝覆盖Activities的视图,Fra

Kotlin教程学习-面向对象

这几天一直在准备考试,实在没有时间,已经过去了这么久,终于要到面向对象了! 先看看Kotlin中的类长什么样吧. 可以看到Kotlin中的类还是很普通的,大多与Java相似,比较特殊的有: 每一个构造函数都必须为每一个成员变量赋予初值. primary constructor,这个构造函数的头部紧跟在类名之后,函数体却在类中,是由init关键字包含的一个代码块,这种函数头和函数体分开的写法还是很少有的,其实这两个部分会被整合成一个构造函数,使用jd-gui反编译class文件可以看到如下最终生成

Kotlin环境搭建---Hello World

对于亲爹都已经宣布它的重要性了,那做为搞安卓的自己有理由去拒绝它么?当然目前国内真正在商业中去采用Kotlin去开发项目的应该不多,但是!这肯定会被普及的,所以为了走在时代的前言,接下来会从基础语法开始一点点去打开Kotlin的神秘面纱并期待自己将其用在商业项目上! 开发工具选择: 先上Kotlin的官网瞅一眼(https://kotlinlang.org/) : 其中有木有看到熟悉的Android Studio,上面说是得在Android Studio3.0版本已经集成了,但是貌似目前公司基本

使用Kotlin开发Android

查看我的全部开源项目[开源实验室] 欢迎加入我的QQ群:[201055521],本博客客户端源码下载[请点击] 摘要 我首先声明我并没有使用Kotlin很长时间,我几乎是在学习的同时写了这些文章的.我并没有尝试任何其它的替 代语言,例如Go和Scala,所以如果你是真的考虑换一种开发语言的话,我建议你去搜索一下其他人对这些 语言的评价. 本文原创,转载请注明地址:http://blog.kymjs.com/ 正文 最近,新了解了一门编程语言,叫做Kotlin.Kotlin是Jetbrains公司

在Kotlin中使用注释处理Android框架 kapt

本教程介绍如何在 Kotlin 中使用依赖于注释处理的流行的 Android 框架和库. 在日常 Android 开发中,流行着数以千计的框架帮助我们提升开发效率. 使用 Kotlin 开发时仍然可以沿用这些框架,而且和使用 Java 同样简单. 本章教程将提供相关示例并重点介绍配置的差异. 教程以 Dagger. Butterknife. Data Binding. Auto-parcel 以及 DBFlow 为例(其它框架配置基本类似). 以上框架均基于注解处理方式工作:通过对代码注解自动生

KOTLIN开发语言文档(官方文档) -- 入门

1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源文件的顶部: 1 package my.demo 2 import java.util.* 3 // … 并不要求包与目录匹配:源文件可以在文件系统中的任意地方. 查看:包(2.2) 1.1.2.   定义函数 函数带有Int类型参数,并返回Int类型值: 1 fun sum(a: Int, b: Int): Int { 2 return a+b 3 } 函数体可以是表达式,并可从中推断出返回值类型: 1 fun su

用Kotlin开发android平台语音识别,语义理解应用(olamisdk)

用Kotlin开发android平台语音识别,语义理解应用(olamisdk) http://blog.csdn.net/ls0609/article/details/75084994

Android Studio不更新到最新版使用Kotlin

第一步:安装Kotlin插件 打开Settings面板,找到Plugins选项,点击Browse repositories(浏览仓库),输入“Kotlin”查找,然后安装即可.安装完成之后需要重启Android Studio. 安装完成之后如下图所示. 第二步:配置Kotlin开发环境 点击菜单栏的“Tools”选项,选择“Kotlin”,然后选择“Configure Kotlin in Project”.如下图所示. 在弹出的窗口中选择需要使用Kotlin的模块和Kotlin编译器和运行时的版