用于 android 开发的 kotlin:是重量级语言还是毫无意义的炒作? -欧洲杯足彩官网

引用
原文:
作者:jose luis franconetti
翻译:陈云龙

在 2017 google i/o 大会的 keynote 演讲中,我们了解到,将在 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,我们开发了 作为 ios 和 android 应用程序的远程日志记录服务。 android sdk 完全由 java 开发。 kotlin 同样可以开发——它可以在 kotlin android 应用程序中使用,因为与 java 可互操作。点击这里查看一个。

查看更多 内容。

结论

相信炒作——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 条 请登录后发表评论

发表评论

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

相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: 用于学校或教育机构的学生信息、教职员工信息、课程管理、成绩记录、考勤管理等。学校管理系统帮助提高学校的组织效率和信息管理水平。 人力资源管理系统(hrm): 用于处理组织内的人事信息,包括员工招聘、培训记录、薪资管理、绩效评估等。hrm系统有助于企业更有效地管理人力资源,提高员工的工作效率和满意度。 库存管理系统: 用于追踪和管理商品或原材料的库存。这种系统可以帮助企业避免库存过剩或不足的问题,提高供应链的效率。 客户关系管理系统(crm): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。crm系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者信息、医生排班、药品库存等。这种系统可以提高医疗服务的质量和效率。 财务管理系统: 用于记录和管理组织的财务信息,包括会计凭证、财务报表、预算管理等。财务管理系统

  • gb2312字符集 作用:国家简体中文字符集,兼容ascii。 位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。 范围:高字节从a1到f7, 低字节从a1到fe。将高字节和低字节分别加上0xa0即可得到编码。 gbk字符集 作用:它是gb2312的扩展,加入对繁体字的支持,兼容gb2312。 位数:使用2个字节表示,可表示21886个字符。 范围:高字节从81到fe,低字节从40到fe。 gb18030字符集 作用:它解决了中文、日文、朝鲜语等的编码,兼容gbk。 位数:它采用变字节表示(1 ascii,2,4字节)。可表示27484个文字。 范围:1字节从00到7f; 2字节高字节从81到fe,低字节从40到7e和80到fe;4字节第一三字节从81到fe,第二四字节从30到39。

global site tag (gtag.js) - google analytics
网站地图