译者简介:ASCE1885, 《Android 高级进阶》作者。
原文链接:https://antonioleiva.com/google-kotlin/, 由于 Markdown 对图片的排版存在限制,因此为了保证排版的美观,本文对作者介绍部分进行截图,不做另外的翻译。
Google 已经多次表达过他们不反对 Kotlin 的使用,只要 Kotlin 编译器依然生成有效的字节码,那么 Google 就不会阻止任何人使用它。
但很多人依然在等待官方的正式支持,一件可能永远不会发生的事情。
虽然我们等到了这一刻,但我想如果能够知道 Google 的 Android 开发专家是如何看待 Kotlin 的,那就更好了。
如果你没有听说过,那你应该了解下,Google 开发专家(GDEs)[1]是一个旨在表彰优秀开发者对所在领域所作出的贡献的项目。
我联系了一些这样的 Android 专家(人员列表很长!),我得到了来自 17 位的答复。非常感谢你们这么好能够花时间来回答。
我只是要求他们告诉我们关于 Kotlin[2] 的一点想法,答案显然是未经过修改的,所以你可以发现支持和反对(或者不那么支持)的声音。
我希望这有助于你知道 Kotlin 是如何成为一个游戏规则改变者的,同时如果你是一名 Android 开发者,我希望 Kotlin 会成为你考虑使用的一门语言。
其他的就不多说的,让我们来看看 GDEs 们的看法吧,排名不分先后:
1. Annyce Davis
我以前使用 Groovy 编程语言开发过 Grails 应用,对于我而言,Groovy 是对 Java 一个极大的改进。它很精简,并有助于避免当时使用 Java 6 语言编码时不得不遇到的很多样板代码。当 Kotlin 出现时,我立刻被它吸引了,因为它的很多语法特性让我想起了 Groovy。它既整洁又精炼。
我是一个狂热的学习者,所以我渴望学习 Kotlin 并基于 Kotlin Koans 开始我的学习之路。我也订购了《Kotlin in Action》的早期访问版本。当听了 Hadi 的 Kotlin 播客后,我被推到了正视 Kotlin 的边缘。当 Kotlin 1.1 发布后,我最终决定正视 Kotlin,并在我的线上应用中引入 Kotlin。
对于 Android 开发者而言,Kotlin 有很多优点。最明显的是它的类型系统和对空类型的处理,这迫使你在编码时指明哪些变量可为空,并在使用的时候遵循这个约定,之后编译器就会介入并确保对变量的赋值都是有效的。空指针异常[3]是我在 Android 应用程序中处理的最常见的异常类型。Kotlin 有助于公平的竞争环境。
Kotlin 另外一个显著的优点是具备扩展函数[4]的能力,通过给 Context
,Activity
和 Date
类添加扩展函数,使得我的代码简洁了很多,同时变得更加易于阅读。
通过使用 Kotlin,我的代码变得更好了。
2. Sebastiano Poggi
我真的真的很喜欢这门语言。我个人认为它在很多情况下使得编码变成一件愉快的事情,相比之前,同样的情况下用 Java 语言编码将会感到痛苦和繁琐。我绝不是一个 Kotlin 专家,因为我还没有在日常工作中使用它,但每次做小项目时我都会使用它。你知道传说中的 10 倍效率的开发者吗?Kotlin 有时让我觉得自己就像一个 10 倍效率开发者(我一直不认为有人能够称为 10 倍效率的开发者,所以这对我来说是一个好的开始)。
简洁的语法是这门语言非常明显的好处,除此之外,我真的很感激它提供的所有附加的 API 和围绕它构建的生态系统。例如,不可变集合是我经常需要的东西,但如果不在应用中(部分)引入 Guava 函数库的话,在 Java 语言中是用不了的,但 Kotlin 对不可变集合提供了一级实现,此外还有一堆的其他特性。哦,我说过当看到 Kotlin
的发布版本将对 LLVM 的支持作为一个目标时,我有多兴奋吗?
然而正如我刚才提到的,我的日常工作并没有使用 Kotlin。虽然有理由相信 Kotlin 的引入将会使项目大大受益,但这个项目却很难引入 Kotlin,因为这个项目的团队规模很大,我苦恼的发现 Kotlin 存在的主要问题:静态代码分析工具的缺乏和成熟设计模式的缺乏。
如果你的项目不大且不复杂,那么后者是一个相对次要的问题,但如果你遇到的是有十个开发者在一个有将近十年历史的巨大的代码仓库中协同工作时,具有良好的设计模式将会使你更加的安心。当然,你可以使用 Java 设计模式,但并不是所有的 Java 设计模式在 Kotlin 中都是有意义的,因为有些设计模式是专门围绕 Java 语言设计的,存在一定的局限性。这是一个漫长的讨论,我将在这里中止它,否则整篇文章就变成这个讨论了😀。
对我来说,前面提到的第一个问题是最关键的,也是真正决定我是否在项目中采用 Kotlin 的关键。你在项目实践中使用不了 PMD,Checkstyle,Findbugs 和其他的静态代码检查工具(还没有试过 Errorprone)的事实,将使你的项目陷入非常危险的处境。首先,如果项目中有超过 3~4 位开发者,你不能指望在代码风格上面能够严格监督;更重要的,你缺少很多从上述工具中获得的深入的 bug 检查功能。如果你从来没有(正确的)使用过静态代码检查工具,那么请举手,我当然不相信你!我知道现在有 IDE 的检查,但那些功能还远不够强大;也有几个项目为 Kotlin 带来了静态代码分析的能力,但它们还不值得让我们依赖。我真的很期待看到它们变得足够成熟,我们最终可以放心的使用它们。
在这期间,我在小的代码仓库上面使用 Kotlin,我喜欢它🙂。
3. Jorge Barroso
Kotlin 迈出了 Android 开发的一大步,在这之前,Android 缺少 Kotlin 所带来的特性,相比于其他的 Java 平台,Android 平台的 Java 开发有些过时,即使现在有在推动 Java 8,但它还是不会变成我们喜欢的现代编程语言。
现在我看到的一个最大的问题是它的推广,说服公司转型到 Kotlin 并展示它的价值很困难。对于技术型公司而言会相对简单,因为对于开发者来说是一个激励和挑战,但对于小公司来说更困难。此外,很多公司担心如果没有 Google 在背后支持 Kotlin 的话,将很难被广泛使用。
我喜欢这门语言以及它对生态系统的贡献,我希望能够在我的日常生活中更多地使用它,但我所从事的项目的性质不允许这样做。我鼓励大家都去看一下,但不限于 Kotlin,可能是另外一门语言,因为这会为他们打开一个新的视野,同时也是编写软件时非常有用的学习。
4. Donn Felker
Kotlin 是极好的,我喜欢它,它是 Android 世界的一股清流。
5. Mark Allison
虽然我也很喜欢 Kotlin,但我不认为它已经足够成熟到能够在线上产品中使用。成熟模式和最佳实践的缺乏,使得 Kotlin 编写的代码可能难以维护。
从 Kotlin 缺乏静态代码分析工具可以看出来。虽然 Java 的静态代码分析工具不完美,但它们可以作为衡量技术债务的好指标。Java 工具不能用于 Kotlin,因为它们专门分析的是 Java 语言源码。
6. Huyen Tue Dao
我完全迷上了 Kotlin。工作中我们 100% 的使用 Kotlin 进行编码,包含线上产品的代码。事实上,无论何时何地只要能够使用 Kotlin 的地方我都会使用 Kotlin 进行编码,归功于 Kotlin 和 Java 的可互操作性[5],几乎可以说任何地方都可以使用 Kotlin。我可以访问系统平台 API 和其他已经存在的代码和函数库,同时享受和利用 Kotlin 所带来的所有现代编程语言特性。
由于 Kotlin 是一门新语言,我们都在发现和定义最佳实践的过程中,我不得不同时从高级和低级两个层面仔细检查每一行代码的影响。这很有趣,迫使我更加谨慎和认真的作出某些决定。
这门语言的简洁令人惊叹。我喜欢 Android,但我们需要处理很多样板代码,Kotlin 有助于减少一些样板代码的编写。虽然太多的精简可能导致代码可读性的问题,我认为大多数时候 Kotlin 实际上提高了代码可读性,只要我们不要太疯狂,并记住我们想要什么样的最佳实践。
7. Dmytro Danylyk
对于那些停留在 Android 世界的开发者而言,Kotlin 是一个真正的规则改变者,它拥有很多我喜欢的特性:空类型安全,data classes[6],属性和懒加载属性,扩展函数,协程,不变性等等。
我很享受使用 Koltin 来编码,因为我没有必要在项目中引入太多的第三方库,Kotlin 已经非常好的提供了大部分的支持。
归功于 JetBrains,Kotlin 有很棒的 IDE 支持以及非常多的学习资料,甚至有在线的 REPL[7]。
8. Anup Cowkur
我曾经使用过像 Haskell 和 Elixir 这样的语言进行编码,因此当我进行 Android 开发时时常在想:“为什么 Android 中不能有这样好用的特性?”。
现在使用 Kotlin,我们可以做到了。
可选类型内置在 Kotlin 的类型系统中,函数是一级公民,类型匹配(某种程度上)和不可变类型等特性终于让我在 Android 开发中可以使用真正的函数式编程。
9. David Vávra
在我的主要应用(Settle Up[8])的生产环境中我使用了 Kotlin,它已经足够成熟,而且相比 Java(任何版本) 有很多的优点[9]。Kotlin 完全兼容现有的 Java 工具和函数库,同时能够很好的在 Android Studio 中使用。
如果现在新创建一个 APP[10],我肯定会选择 Kotlin。最常见的反面论点是:“但是还不熟悉 Kotlin 的同事会抱怨而且会降低开发效率”。这一点我是不同意的,从 Java 转到 Kotlin 真的不需要费多大劲,而它的优点会很快呈现出来。相比之下,刚开始使用 RxJava 将会感觉困难得多。
对于移植现有 APP 而言,是否使用 Kotlin 需要根据具体情况而定。例如你可以只在一个页面使用 Kotlin,但如果想 100% 发挥这门语言的优点,那最好是全面转到 Kotlin。当然这一点我们很难向项目负责人去证明。
Kotlin 现在唯一需要的仅仅是 Google 的官方认可,Google 不需要做其他任何事情,只需要在官方文档中增加 Kotlin 版本的代码片段(像对 Swift/ObjectiveC 所做的那样)。如果官方认可 Kotlin,那么我们将会看到 Koltin 成为大部分人的主要选择,祈求在今年的 Google I/O 大会上变成现实。
10. César Valiente
我认为 Kotlin 是一门非常棒的现代编程语言。
它的学习曲线很平缓,你可能只需要花一天时间来学习它的语法,就可以用 Kotlin 写出一些代码,实现某些功能。Kotlin 写起来真的很过瘾,很好玩,而且很简洁,它具备其他现代语言的特性,它由 JetBrains 这样很专业的团队进行持续的开发,同时一直有社区的支持,因为它是开源的!
这里我不想花时间介绍 Kotlin 的那些解放开发者的特性,因为官方文档已经做了很好的说明,同时我们可以在 IDE 或者 Web 页面中使用 Koans[11] 来进行练习,Kotlin 社区也在不断的发布者新的激动人心的内容。
在 Android 平台,Kotlin 给我们 Android 开发者带来一股清流,给了我们一个新的理由来享受编写 APP,使用 Kotlin 你可以编写更少的代码,最重要的是在一天结束时,你的代码可读性更强,样板代码更少,而且由于编写同样的代码所花费的时间更少,你将变得更有生产力,正如我前面说过的,使用 Kotlin 你会很开心!
至少在 Android 社区,有一个问题悬而未决:kotlin 已经准备好应用在线上产品了吗?我的回答是当然,JetBrains 去年就已经发布 1.0 的稳定版本。
你觉得如果没有为线上产品准备好的话 JetBrains 的聪明家伙们会正式发布它吗?当然不会。Kotlin 已经用在了 JetBrains 的一些产品中,其他公认的伟大的公司也在线上产品中使用了 Kotlin。
好的,一切听起来不错,但应该也有一些不好的地方吧?没错,Kotlin 社区等待的事情之一是工具的支持。当你在一个团队工作时,静态代码分析工具是非常重要的。在 Kotlin 中我们仍然有所欠缺,当然你可以对 Kotlin 工程进行构建,运行测试等,这些基础的功能还是有的,但像 CheckStyle,PMD,FindBugs 之类的支持 Java 语言的工具非常重要,在 Kotlin 中还不支持(好吧,在 IntelliJ 中内置支持代码分析,但这是不够的)。
所以,如果你在一个大团队中工作,静态分析工具在你的日常工作中是非常重要的(理应如此),你需要对这一点多加考虑。如果你在一个小团队中工作,那么你可以控制所有事情的发展(译者注:包括使用 Kotlin)。
总的来说,Kotlin 是伟大的,使用 Kotlin 你将会拥有更多乐趣,同时工作也更高效(至少比用 Java 开发 Android 强),虽然还有关于静态代码分析工具的一些问题,但如果你能够不使用这些工具,那么去尝试 Kotlin 吧,你会爱上它的!😉
11. Nelson Glauber
Kotlin 是一门令人印象深刻的语言,该语言的特性是惊人的,它移除了 Java 语言所需的一堆样板代码。更不用说市面上绝大多数函数库(用 Java 语言编写)完全兼容 Kotlin 的事实。另外一个使得该语言易于采用的是它和 Android Studio 的完美和稳定的兼容。
对于 Java/Android 开发者(新手可能未必如此)而言学习曲线很缓和。我从去年开始通过阅读 Antonio 的书[12](顺便说一句,这本书很棒)来学习 Kotlin,从那以后,我一直在我的个人项目和演讲中使用这门语言。
不幸的是,我还没有机会在线上产品中使用它,但我毫不怀疑 Kotlin 已经成熟到足以在大型项目中有效的使用。
在我看来,不使用 Kotlin 的唯一理由是,一旦你开始用 Kotlin 进行编码,你将不想再使用 Java 进行编码🙂。
12. Ryan Harter
大约一年前,我开始用 Kotlin 来编写所有的新代码,经过一些尝试,我发现它是稳定的,而且这门语言提供的若干特性所带来的好处值得我做这样的转换。归功于 Kotlin 和 Java 的可互操作性,任何我用 Kotlin 还不知道怎么实现的功能,我可以回退到使用 Java 来实现。
Kotlin 的扩展函数语言特性最大程度上简化了我的工作流程,虽然这个特性很简单。在我的图形相关工作中,需要做大量的数学和矩阵操作,也就是会用到很多工具类。扩展函数[13]极大的简化了代码的编写,并使代码更加的精炼。在原有的面向对象编程的基础上,混合着对函数式编程的支持,使得工作更加的愉快。
对于正在考虑切换到 Kotlin 的开发者,我的最大建议是记住 Kotlin 和 Java 并不是非此则彼的关系,相反,Kotlin 能够很好的和现有的 Java 代码协同工作,所以你可以一步一步的开始尝试使用 Kotlin。
13. Ubiratan Soares
从一个开发者的经验来看,Kotlin 是 Android 应用开发的未来。
Kotlin 对 Android 开发的影响和三年前 Grade 对 Android 的影响非常相似。作为 Android 开发者社区,我们应该拥抱 Kotlin,传播 Kotlin,并让一大批的开发者来使用 Kotlin,因为我们值得拥有更好的方法来开发 APP,满足用户的需要并在工作中取得好成绩。
14. Philippe Breault
Kotlin 对于 Android 开发者而言是一股清流。
我喜欢它在 lambda 表达式上所做的工作,能够让编译器内联 lambda,当它起作用时,允许我们 Android 开发者在紧凑循环中使用它,这样通常可以避免实例化新对象。
简单的特性当然也很重要,例如表达式后面不需要加分号;如果在同一行给一个变量赋值时不需要输入两次变量的类型;使用属性来代替 getters/setters 方法等等。这些特性使得代码阅读更方便。
我唯一希望得到改进的功能是 Android Gradle 插件和 Kotlin 插件的可互操作性。现阶段,两者的混合使用经常会出现问题。
话虽如此,每个 Android 开发者都应该对这门语言保持关注,最好是尝试使用它。
15. Iñaki Villar
Kotlin 为 Android 平台带来了新酷的概念,而不仅仅是使用另外一门语言来编写类和 activities。
我们此时正在将自动化框架移植到 Kotlin 上,我们正在享受如何用声明的方式定义自己的 DSL,并让开发和测试人员更流畅的编程测试代码[14]。
16. Dan Lew
在不牺牲性能或者安全性的前提下,Kotlin 相比 Java 能够编写更加简洁易懂的代码。Kotlin 最终编译为字节码,因此能够表现的跟 Java 一样好,它跟 Java 有一样的编译时检查(同时具备 Java 没有的内建空类型检查)。更重要的,Kotlin 的语言特性和标准库函数能够编写简洁有效的代码。
此外,Kotlin 拥有强大的生态系统。当然,来自 JetBrains 的原生工具支持是不错的,除此之外,这门语言正得到积极的支持和改进,同时,JetBrains 在每次升级 Kotlin 时并没有做不兼容的修改。而且 Kotlin 可以和 Java 很好的相互协作,这使得从 Java 到 Kotlin 的转变很容易。
最后,作为一个 Android 开发者,我喜欢 Kotlin 还有另外一个重要的原因:Kotlin 能够独立于 Android 系统版本进行升级。由于 Java 语言的能力是和 Android 操作系统绑定的,开发者经常会错过 Java 新版本的语言特性和标准库 API。相比之下,当 Kotlin 新版本发布时,你就可以开始使用新版本的语言特性了。
17. Enrique López Mañas
我是作为一名 Java 开发者自然而然的过渡到 Android 开发的,因为两者语言是通用的,所以我决定试一下,这是一个充满意义的选择,就我个人而言,这一年是在 2009 年。Java 诞生于 1995 年,从那时起到现在,陆续发布了一些新版本,在原有语言特性的基础上进行新增和改进,当前的版本是 Java 8。Java 是 22 年前设计的,考虑到技术发展的速度,Java 算是一门不朽的语言,同时目前它也有一些不容忽视的缺点。作为一个开发者,我经常会尝试其他语言。最明显的解决了 Java 某些缺点的语言是 Scala。转折点是我在实践中看到了像 Swift 这样的语言。我也在为 iOS 平台编写代码,并注意到 Swift 是如何克服像空类型这样的具有明显缺点的语言特性的,从此打开我在 Java 语言中一直以来忽略的很多问题。
由于最初设计等本质原因,Android 平台原生支持所有 Java 7 的语言特性,部分支持 Java 8 语言特性。相当于 Android 平台跟其他使用 Java 语言的平台相比,落后了很多。而 Kotlin 的出现填补了这个空缺。
Kotlin 是一门现代编程语言(1.0 版本是在 2016 年 2 月发布的)。它最初的目标是弥补 Java 的缺点,像 Scala 语言所做的那样,但解决了一些存在的问题(例如,编译时间)。
JetBrains 对 Kotlin 作了了不起的优化工作,在最近一个版本中 Kotlin 的编译时间得到了显著的提升。作为一个 Kotlin 新手,下面是最初我想到的一些问题的答案:
- 和 Java 的可互操作性:Kotlin 可以直接和 Java 类进行交互,当然也有其他方式。最基础的一点:我确实想重用老的代码仓库,并引入 Kotlin。
- 转换工具:虽然不能盲目的信任 Java 到 Kotlin 的自动转换,但这个功能确实很棒。当我将 Java 类转换为 Kotlin 类时,我可以很容易的复用 60%~70% 的结果代码。我的做法是不要一次性将整个代码库从 Java 转换为 Kotlin,而是遵循小步迭代。这样审查转换后的代码所花的时间也会很少。
回到 Kotlin 本身,在使用 Java 进行多年的开发后,尝试使用 Kotlin 这种新鲜东西感觉很棒。如果你是一名 Java 开发者,Kotlin 的语法对你而言是非常自然的。如果你是一名 Swift 开发者,也会有同样的感觉,而且你会很容易理解 Kotlin 的一些关键概念例如空类型。Kotlin 其他吸引我注意的特性如下:
- 空类型:告诉你公司的业务人员你可以避免产品中三分之二的异常,这将是一件令人心动的事情。直到开始使用 Kotlin,你才意识到在 Java 中没有空类型是多么糟糕的一件事情。
- 函数式编程:是的,Kotlin 正如 Scala 一样,支持函数式编程。
- 默认和命名参数:再次的,如果你之前没有尝试过这种特性,你将永远不会知道它的可贵之处。在 Kotlin 中,你可以为一个函数的参数设置默认值,并为每个参数命名。这成倍的增加代码的可读性和易读性。
- 智能的强制转换:厌倦了使用
instanceof
进行类型判断然后进行类型转换吧?它似乎总是非常多余的步骤,本应该很容易防止的。Kotlin 自动为你实现这些步骤。
Koltin 还有一堆的特性,可能需要几篇文章的篇幅来进行列举和深入介绍。总结来说:Koltin 是一门用于补充和完善 Java 不足的语言。对于 Java 开发者而言学习曲线很平缓。这不是一个非此即彼的问题,因为你可以在你的 Java 代码仓库中同时使用 Java 和 Kotlin。Kotlin 将会提高您的工作效率,从中长期来看,它将使你成为一名更好的程序员。