阅读更多
引用
原文:Kotlin for Android Development: Heavyweight Language or Hopeless Hype?
作者:Jose Luis Franconetti
翻译:陈云龙

在 2017 Google I/O 大会的 Keynote 演讲中,我们了解到,Kotlin 编程语言将在 Android 上正式受到官方支持。消息一出,世界各地开发人员纷纷击掌欢呼——很多人认为 Java 即将会被取而代之(老实说,我依然是 Java 的爱好者)。

对 Kotlin 的炒作是否合情合理呢?其实这也相当于 Swift 语言的发展,令人兴奋的同时也有因这门语言并不成熟,所以很多开发者并没有使用它。

两年前我曾发誓倘若 Google 不支持它,我也不会开始认真学习 Kotlin。既然现在已经做了支持,那么我也有理由继续深入学习。

为了能快速学习这门新语言,我基于已有的开发技能并利用熟悉的语言(Java 和 Scala)来学习 Kotlin。

第一印象

当阅读 Kotlin 文档时,我注意到的第一个地方是它能编译字节码、JavaScript、Native、而且它是由 Jetbrains 开发的。下面让我们一起来攻克这门语言吧。

如果 Kotlin 编译为字节码,则意味着它在运行时使用 JVM(Java虚拟机)将字节码编译为机器码。

那么 JavaScript 呢? 事实上,它使用目标 ECMAScript 5.1 将 Kotlin 代码转换为 JavaScript。 虽然我不是 JavaScript 专家,但是可以查看官方文档以获取更多详细信息。

Kotlin 的一个厉害的特性在于能够编译原生,并支持更多没有 JVM 的平台 - 现在,Kotlin Native 可以在 Mac OS、Linux、Raspberry Pi 和 iOS(通过在 Mac 上交叉编译)上使用 LLVM 生成可执行文件。 Windows 平台尚不支持,但他们正在开发中。

我梦想的场景是:用 Kotlin Native 开发 Android 和 iOS 应用程序的所有业务逻辑,然后用特定平台语言(Android = Java / Kotlin,iOS = Objective-C / Swift)开发 UI。 Kotlin Native 仍然未成熟,所以在它成熟之前我必须等。

另一个人们比较关注重视的问题:

Kotlin 与 Java 能 100% 兼容吗?

查看官网就能知道答案:

这就是我此刻的反应:

但在我们真正深入了解这个特性之前,还有更多的细节值得我们去探索。

如果阅读过关于 Kotlin 的文章,也会了解到它的特性:
  • 不变性
  • 代码量比 Java 少
  • 空指针安全性
  • 功能编程性
下面我们详细分析一下这些特点。

不变性

与具有功能编程概念的所有语言一样,不可变性是主要的讨论要点之一。 那么在 Kotlin 中它是如何工作?

变量可以是:
  • 可变的:由关键字 var 表示;
  • 不变的:由关键字 val 表示。
关键字 val 真的不可变吗?

不。当定义真正不可变的变量时,我们总是需要检查它是否满足两种不可变:
  • 不可变的引用:一旦分配了引用,它就不能被分配给其它的引用。
  • 不可变值:引用的值不能被改变。
fun foo() {
    var mutable: Int = 1
    val immutable: Int = 2

    mutable = 2 // All OK
    immutable = 3 // Compile error

    val collection = arrayListOf(1, 2, 3) // Immutable reference to a collection
    collection.add(4) // Adding a value to the collection, so we are modifying the values of the immutable collection.
}

那么 Kotlin 有不可变的 collection 吗?

是的,它的确有。

你可以在不可变的 collection、map、set 等之间进行选择,因为该语言具有两种实现。如下所示:
fun bar(){
    val immutableList = listOf(1,2,3)//引用和值都不可变
    val mutableList = mutableListOf(1,2,3)//引用不可变但值可变
}

代码量比 Java 少

Kotlin 有只保存数据的数据类,所以写所有 POJO 类可以用一种简洁的方式。
public class Foo {
    private int id;
    private String name;

    public Foo(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

data class Foo(var id: Int, var name: String)

好的,此刻你肯定在想:为什么你使用 var(可变的)而不使用 val(不可变的)呢?

这是因为 Java 中 Foo 类从一开始就设置为可变。

在 Kotlin 扩展中可以找到另一种编写较少代码的方法。其允许你在不修改源代码的情况下向类中添加方法/函数——告别使用 Utils 类。 Kotlin 团队已经使用了扩展的 JDK 类,如文件、IO 和线程。

以下是标准库的示例:
fun File.deleteRecursively(): Boolean

fun File.forEachLine(
    charset: Charset = Charsets.UTF_8, 
action: (line: String) -> Unit)

空指针安全性

如果使用 Java 开发,那么在某些情况下,必须处理NPE(Null Pointer Exception),当忘记检查变量是否为 null 或者你没有预料到会有一个空值变量时,它会弹出 NPE。

Kotlin 对此有一个聪明的解决方法:默认情况下使所有类型不可为空。因此,编译器不会让你使用未初始化或不可空变量。但是通过运算符“?”你仍然可以使用可空类型。

以下是几个案例:
var foo =“Foo”
foo = null //编译错误

var bar:String? =“Bar”
bar = null

你可能会认为,不可为空的类型并不总是会被使用,因为有时它不在控制范围内,例如网络响应问题。

别担心,Kotlin 包含一个“Elvis 操作符”,通过这个简单的操作符“?”就可以表达典型的 if else null :
val foo:String = bar?:“Foo”

所以告别 if else 表达式。
String foo = nullableResponse();

if (foo == null) {
     // do something
} else {
     // do something
}

最后一个关键是,你可以像 “?”一样使用 “!!” 操作符。它们区别在哪里?如果变量为 null,它将抛出一个NullPointerException,所以请避免使用它!

Java 互操作性

这个话题对我来说特别重要,因为我所有在 Android 及后端开发中都是用 Java 编写的。我也为此感到骄傲,所以我现在不想改变他们。

如前面所述,Kotlin 与 Java 是 100% 兼容的。

以下是使用 GSON 和 Retrofit 的一些示例:
@GET("playlistItems")
fun playlistItems(@Query("part") part: String,
     @Query("maxResults") maxResult: Int, @Query("playlistId") playlistId: String,
     @Query("pageToken") pageToken: String?, @Query("key") key: String): Call

val response: Response = api.playlistItems(api.SNIPPET_PART, s.limit, s.playlistId, s.nextPageToken, googleApiKey).execute()

data class VideoResourceNetwork(@SerializedName("kind") val kind: String?,
     @SerializedName("videoId") val videoId: String?) : Model(identifier = videoId)

在 Mobile Jazz,我们开发了 Bugfender 作为 iOS 和 Android 应用程序的远程日志记录服务。 Android SDK 完全由 Java 开发。 Kotlin 同样可以开发——它可以在 Kotlin Android 应用程序中使用,因为与 Java 可互操作。点击这里查看一个例子

查看更多 Kotlin 内容。

结论

相信炒作——Kotlin 是一种成熟的语言,为 Java 开发人员提供了一种用于现代多平台应用的静态编程语言作为新起点。 Java 8 是基于以前 Java 版本的一个比较大的更新,但作为 Android 开发者,我们只能使用 Java 8 的一小部分功能。 Kotlin 这点对我们来说更好。
  • 大小: 15.3 KB
  • 大小: 45.2 KB
  • 大小: 770.7 KB
  • 大小: 1.1 MB
  • 大小: 1.3 MB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 程序员开发指南!全世界都在问Android开发凉了吗?大厂面试题汇总

    开头 ...我的10年开发生涯中,有9年都是做Android相关开发,以我个人的经历来看,Android开发市场分为以下几个阶段,也许不是特别准确,但我觉得值得参考。 第一阶段 :混沌期 这个阶段大概在2009到

  • Android开发人员不得不收集的代码,看看这篇文章吧!

    1、项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,...我的10年开发生涯中,有9年都是做Android相关开发,以我个人的经历来看,Android开发市场分为

  • Android资料!为什么说Flutter让移动开发变得更好?含BATJM大厂

    2021新的一年,开启新的征程,回顾2020,真是太“南”了。...我认识很多优秀的 Android 工程师,他们丝毫不焦虑,因为他们知道清晰地知道自己的薄弱处和强项。 和他们的交流中,我总结了 3 点经验,分享

  • 简单聊聊2021年Android开发的现状和思考,看看这篇文章吧!

    这个时候出现了很多重量级跨平台框架,组件化、Kotlin、Android Jetpack、移动AI等技术映入了我们的眼帘,Android进阶三部曲诞生在这个时期。 可以说现在的形势看似不容乐观,但是暗藏生机。下面说说Android开发的...

  • 安卓开发注册登录怎么实现?Android事件分发机制及设计思路,成功入职阿里

    缘起 深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一。 腾讯业务多元化,覆盖面广:社交、通信、娱乐...1.Android开发的几个阶段 我的1

  • android开发入门教程!一次违反常规的安卓大厂面试经历,重难点整理

    恍惚间会让人想到2010年,安卓初兴,一切还是桌面应用开发的天下,当时的语言还集中中JAVA、HTML、MFC、.NET、C#,各个语言为了争夺桌面应用开发第一位,也是拼得你死我活。当时的安卓系统还是方兴未艾,谁也不知道...

  • 农民工看完都会了!该如何高效实用Kotlin?内含福利

    前言 许多 Android 开发者经常会问我,要学会哪些东西才能成为一个优秀的 Android 工程师?对于这个问题,他们的描述或多或少都有些差异,但是,...因此,在本文中,我将分享我在 Android 开发中所使用到的重要技能,

  • 面试字节跳动Android工程师该怎么准备?深度解析,值得收藏

    前言 Android高级架构师需要学习哪些知识呢?...这个阶段大概在2009到2013年,Android刚开始出现在大家视野中,当时的Java开发有点像现在的Android开发,不是很热门,竞争压力大,因此很多Java开发转了Android开发,我

  • GitHub标星50k的Android全栈技术知识:你会的还只有初级Android工程师的技术吗?终于搞明白了

    我一开始就很紧张,自我介绍说的一塌糊涂,毫无重点。但面试官很友好,一直跟我点头互动,认真听我不知所云的自我介绍。我很愧疚自责:我浪费了人家的时间。 然后面试官问我是否在找新的工作机会。我说是的,我很想...

  • 别拦我,我不想搞Android开发了!

    这篇文章开头,我先举几个赤裸裸的例子,都是最近朋友和网友跟我说的。...朋友老刘:我36了,最近联系猎头找个工作,猎头说只能找技术管理类的了,纯开发的一般公司 32 岁的就不招了。 朋友六子...

  • 2021年互联网大厂Android笔经,你还看不明白?

    这个阶段大概在2009到2013年,Android刚开始出现在大家视野中,当时的Java开发有点像现在的Android开发,不是很热门,竞争压力大,因此很多Java开发转了Android开发,我就是其中一员。在09年到10年时有个说法,说...

  • 经验分享:从零开始系统化学Android,面试资料分享

    很多程序员都有这样的觉悟;找工作学历是敲门砖,没有211,985起步的学历,想进一家大公司不太可能。...我的10年开发生涯中,有9年都是做Android相关开发,以我个人的经历来看,Android开发市场分为以

  • Android中为什么需要Handler?高级面试题+解析

    我的10年开发生涯中,有9年都是做Android相关开发,以我个人的经历来看,Android开发市场分为以下几个阶段,也许不是特别准确,但我觉得值得参考。 第一阶段 :混沌期 这个阶段大概在2009到2013年,Androi.

  • AVR单片机项目-ADC键盘(源码+仿真+效果图).zip

    使用adc功能来判断不同电压,那必定是通过电压的不同来区分的,这就需要按键与电阻进行组合,我设计打算使用正比关系的按键阻值,这样会比较好在程序判断,最后就如仿真图那样设计,按键按下让某部分电路短路,剩下的电路得到不同的电压值,而不同按键按下,对应的电阻值是10k的倍数,很好区分。而基地的电阻设为10k,按键靠近gnd的电压值最小,远离则慢慢增大,可大概计算出来的,分压的电压为5v。按键不按时为0v,有按键按的电压范围为2.5v~0.238v。然后用以前编写好的数码管驱动拿过来用,也就是用动态扫描的方式进行显示的。然后编写adc代码,根据atmega16的数据手册就可以慢慢写出来了,即配置好ADMUX、ADCSRA寄存器,使用单次触发的方式,写好对应的函数,在初始化之后,使用定时器1中断进行adc的读取和数码管的刷新显示。而adc对应按键的判断也使用了for循环对1024分成1~21份,对其附近符合的值即可判断为按键i-1,可直接显示出来,而误差值可以多次测量后进行调整。 使用adc功能来判断不同电压,那必定是通过电压的不同来区分的,这就需要按键与电阻进行组合,我设计打算使用正比关系的按

  • java毕设项目之基于SpringBoot的失物招领平台的设计与实现(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:springboot,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3

Global site tag (gtag.js) - Google Analytics