阅读更多
引用
原文: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教学视频!2021年是做安卓开发人员的绝佳时机,高级面试题+解析

    ”其实这两个问题对应着同一个现象,无论是准备入行或刚刚入行,还是比较资深的开发者,对于移动开发职业的未来,都有一些迷茫、一些焦虑。为什么会这样? 1.Android开发的几个阶段 我的10年开发生涯中,有9年都是做...

  • 程序员开发指南!全世界都在问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开发还不会这些?一线互联网移动架构师筑基必备技能之Java篇,BAT大厂面试总结

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

  • Android开发必须会的技能!最全的BAT大厂面试题整理,送大厂面经一份!

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

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

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

  • Python零基础30天速通(小白定制版)(完结)

    宣导片:开启Python进阶之路 30动漫番剧播放量影响因素分析1综合案例 29小红书卖货实力与用户分析1综合案例 28星巴克门店探索|Matplotlib实战 27詹姆斯哈登的制胜宝典1 Panads的使用 26一晚5万的酒店| Numpy的使用 25揭开数据分析的面纱1数据分析"三剑客"概述 24虎牙直播数据告诉你谁最火1案例篇 23我的音乐我做主1数据保存之csv和excel 22电竟| BeautifulSoup解析HTML 21对李焕英的评价1HTML基础 20我的美食我做主1爬虫介绍、requests请 19看我四十二变1内容提取和格式转换 18我的版权我做主1PDF就是这么帅 17婚礼策划师离不开你|亲爱的PPT 16运营部的烦恼1战胜Excel 15Up主的创作之路1 Python与word初次 14你的offer之选|邮件发送 13我的存在只为悦你1 Pillow图片处理 12你喜欢的电竟赛事大全1 Python的文件操作 11哈利波特的魔法棒|模块 10龙珠之赛亚人1面向对象基础 09大吉大利今晚吃鸡1特种兵的战场(项目案

  • 20240519基本完整

    20240519基本完整

Global site tag (gtag.js) - Google Analytics