查看原文
其他

2018-05-24


今年以来,不断有 Oracle 和 Java 的新闻爆出。先是 Oracle 以 Java 侵权案从 Google 处获取高达 88 亿美元的赔偿款,虽然维权属于正当行为,但也让不少用户认为 Oracle 已然将 Java 用作挣钱的工具。一个月后,Oracle 又宣布了 Java 8 将在不久后停止维护,并且决定了要取消 JavaOne 会议,一个专属于 Java 的开发者大会。


接二连三的事件,让用户开始感叹:“Oracle 就是开源的一大公敌”、“Java 早晚会被 Oracle 玩坏的”。


最近,Hackernoon 上还有一位作者发表言论称:Java 已经成为历史。它无法发展成现代语言,同时保证向后兼容性。并建议 Android 开发者赶紧转向 Kotlin


正文如下:


文章仅代表作者个人观点,不代表本公众号立场,如有异议,欢迎留言发表。


Java 已经成为历史。它无法发展成现代语言,同时保证向后兼容性。但它为我们带来了最好的 JVM 生态系统,并引导了许多优秀语言的诞生,如 Groovy、Scala、Clojure、Kotlin 等。



欢迎年纪最小的 Kotlin!


Kotlin 诞生于2011年,但在去年 Google 宣布 Kotlin 成为安卓的官方开发语言之后迅速走红。Kotlin 从其他 JVM 语言中借鉴了大量强大的功能。我们来快速浏览一下 Kotlin 能为 Java 开发者带来的好处。


  • 无需再担心 NPE


Java 程序员都讨厌运行时出现空指针异常(Null Pointer Exception,简称 NPE)。Kotlin 提供了最好的支持,从而在编译时避免空引用。默认情况下,所有对象都不能为空,如果想定义可空的类型,就必须使用 ? 操作符。访问可空的对象时,编译器会强行要求使用安全调用操作符 ?.。还可以用 Elvis 操作符 ?: 来赋默认值。


  • 无需提供显式类型声明


Kotlin 能够自动推断类型,因此无需显式声明。只需使用 val 就可以定义 final 变量,用 var 定义普通变量。注意只有声明和赋值出现在同一条语句时才能推断类型。


  • 避免复杂的字符串格式化


Kotlin 允许使用字符串模板来简化字符串格式化。$ 可以用来引用变量,复杂的表达式可以用 ${}。


  • 创建简单的 POJO 无需使用样板代码


Kotlin 提供了 data 类,用来定义仅仅用来保存数据的对象。Kotlin 会为 data 类自动生成 equals、hashCode、toString、copy、gette r和 getter(针对用 var 定义的属性)方法。还可以对 data 类使用对象解构,将对象属性保存到变量中。


  • 可以避免 Builder 类和冗余的方法重载


Kotlin 支持方法的命名参数,因此在大多数情况下无需再创建 Builder 类。此外,Kotlin 还支持默认方法参数,因此无需再为传递默认值而重载方法。


  • 静态初始化集合无需再使用 guava 库


Kotlin 提供了简单直接的方法,利用 listOf、mapOf、setOf 方法在行内初始化集合。Map 的初始化还支持直观的 key to value 语法。它还支持 Map 的解构,以方便迭代。


  • 创建 Singleton 不再复杂


Kotlin 的 object 声明只需一行代码就能创建 Singleton。


  • 无需使用不必要的局部变量


在 Kotlin 中,try、when 等结构其实是带有返回值的表达式。例如,可以将 try 的结果赋给变量,这样就无需再创建局部变量了。类似地,when 也可以当做表达式使用。when 相当于 Java 的 switch,但要强大得多。


  • 可以避免类强制转换的异常


Kotlin 提供了 is 操作符(相当于 Java 的 instanceOf)以检查对象是否为指定的类型。使用 is 运算符会自动进行类型转换。这样就能避免由于错误的类型转换导致的异常。


  • 同一个对象内的调用序列中,无需再重复类型名


Kotlin 提供了 with 结构以方便反复调用同一个对象的方法,这样就无需每次都指明变量名。Java 通常采用 builder 模式和方法链来实现这一点。但在 Kotlin 中更简单,甚至对于非 builder 类也一样。


Kotlin 还提供了 apply 这个扩展函数,能够实现相同的功能。


  • Delegation 或 decorator 模式无须再使用样板代码


为了使用组合代替继承,我们通常采用 delegation 或 decorator 模式,但 wrapper 类必须重复被代理的类的每个方法。Kotlin 中能够通过 by 操作符来简化 delegation 模式。它将自动实现必要的方法来调用被代理的类。当然,必要的时候仍然可以重载特定的方法。


  • 创建静态函数无需再使用类


Kotlin 支持类之外的函数,因此创建静态工具函数无需再创建类。


  • 在 lambda 中修改非 final 的变量无需再使用 hack


Java 支持 lambda 的方式是将其自动替换成匿名类,但这样就无法在 lambda 中改修非 final 的变量了。但在 Kotlin 中你能直接修改 lambda 中的非 final 变量。


  • 延迟加载不再困难


Kotlin 提供了非常简单的方法,只需指定 lazy 关键字,就可以推迟属性的初始化。


  • 不需要完全切换到新语言


Kotlin 能与 Java 无缝结合,因此与旧 Java 代码的集成十分方便。你可以继续使用第三方 Java 库和框架。与 Scala 不同,Kotlin 没有自己的集合库,它只是扩展了 JDK 的集合。因此在 Java 和 Kotlin 的集合类型之间转换无需使用胶水代码。


  • 代码更紧凑,更易读


Kotlin 采用方法名惯例重载了许多操作符,以增加代码的可读性。例如,方法plus用来重载 + 运算符,minus 重载 - 运算符,times 重载 * 运算符,div 重载 / 运算符,等等。它还支持更多的运算符重载,如%、+=、+-、++、-- 等。


Kotlin 使用 .. 运算符定义范围,使代码更紧凑。它还提供了 until 关键字以去除边界,step 操作符以跳过项目。in 操作符用来检查范围。还可以通过实现 rangeTo 和 contains 方法来重载 .. 和 in 运算符。


  • 扩展现有的JDK类很容易


Kotlin 可以通过非常简单的方式给现有的类增加扩展函数。这是个很强大的功能,利用它可以轻松扩展语言的核心 API。


为什么应该使用 Kotlin?


可以将生产力提高许多倍:


  • 它是静态类型语言,因此编译时就能捕获许多 bug;

  • 工具支持完善,毕竟是写IDE的公司出品的语言;

  • 由 JetBrains 这个 IDE 公司创建,他们很关心开发者的生产力;

  • 能避免Java开发者的许多日常的烦恼。


可以获得许多最佳实践:


  • 所有类都是 final;

  • 集合是 immutable 的;

  • 通过必须的关键字实现重载,而不是可选的注解;

  • 没有必须处理的异常(checked exception);

  • 没有原始(Raw)类型;

  • 对泛型的支持更简洁。


非 JVM 的支持:


  • Kotlin 还可以编译成 JavaScript 用于前端开发;

  • Kotlin 还可以在其他原生运行时上执行,因此无需JVM即可运行。

开发者应该转换到 Kotlin 吗?


Kotlin 很不错,但还不完美,距离完美的语言还需要一些实践。它背后是 JetBrains 和 Google,因此可以相信它只会越来越好。


如果你是安卓开发者,那么应该立刻使用 Kotlin。


如果是 Java 开发者,那么还应该考虑下其他因素,如团队成员、公司的接受程度等。但即使不能立即使用,也应该看看 Kotlin 这个现代语言的美。


而且,根据 ThoughtWorks 的技术报告解读,公司可以在风险可控的项目中尝试使用Kotlin。


Kotlin 足以取代 Java 吗?欢迎发表你的看法~


原文:https://hackernoon.com/java-is-too-old-what-should-you-learn-in-2018-12cd0151b2d1

作者:Rajasekar Elango,Salesforce.com首席软件工程师,负责Java和其他JVM语言。

译者:弯月,责编:CSDN-言则




推荐阅读

微软终于修复了 Notepad 长达 33 年的换行“Bug”

没想到吧!Intellij IDEA 神器还有这些小技巧

写作 C# 读作 C 井,这些程序员常用词汇你读对了吗?

ARM 授权费用太贵科技巨头欲转向开源架构 RISC-V

谷歌终于开放 ".app" 顶级域名注册

点击“阅读原文”查看更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存