今年以来,不断有 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-言则