无论您最熟悉的 java、scala 还是其它 jvm 语言,总会有更多 jvm 语言不断出现并伴随着各种相关特性。最重要的是,总有一些来自某些语言的、优秀的 “基本” 元素在其它语言中难觅其踪。

正因为如此,我们整理出了这样一篇精简的囊括 groovy、scala、clojure、kotlin 以及 java 的部分最佳特性的文章。阐述了它们的区别,以帮助你在项目研发里面合理的选择他们。
是否检查异常情况
java 中最具争议的特性当属 checked exceptions,checked exceptions 会在编译时强制执行,同时需要进行某种排序处理。这意味着我们需要在方法中对其进行捕捉或者声明。
虽然部分开发者更倾向于忽略 checked exceptions,但这一特性确实能够强制要求大家处理例外情况并借此改善代码质量。因此,虽然其人气不高甚至在一定程度上可以忽略,但必须承认其对于提升编码思路还是有所助益的。
kotlin、clojure、groovy以及scala都不支持checked exceptions。
非空即真的 elvis 操作符
在这里之所以选择 elvis 操作符作为讨论对象,是因为其是一种相当便捷的默认值处理方式,且有助于降低重构情况下的错误风险。在它的帮助下,我们无需复制表达式以进行条件与主动返回值测试,从而轻松实现 null safety。
elvis 这个二元运算操作符会返回第一个为 true 的操作数,否则则返回第二个操作数。elvis 操作符属于三元运算符的精简版(三元运算符同样可用于 java),后者本身又是用于将值分配至变量的 if/else 分支表达式的精简版。下面是 groovy 代码示例:
kotlin 同样使用 elvis 操作符在 null 引用中实现 null 安全,但必须使用 “?”。如果该操作符左侧的表达式非 null,则 elvis 会将其返回。否则,其返回该操作符右侧的表达式。整个过程可以简单翻译为以下行:
java 并不提供 elvis 操作符,但其利用类似的方式实现 null safety,因此大家需要在处理 null 输入时做好准备。大家可以使用 optional 作为可选方案,其能够容纳一个可以或不可以包含非 null 值的对象。因此如果某个值切实存在,ispresent() 将返回 true 而用 get() 将返回该值。
同样,scala 采用类似的 optional[t] 实现相同效果。其能够容纳符合特定类型的 0 或 1 元素。如果某值缺失,大家会收到具有 none 值的 some[t]。
类似弱类型语言的类型推断机制
kotlin 和 scala 都引入了一种类型推断机制,允许我们在定义变量的时候不需要指定类型,即整形、字符串、浮点型等等。而由语言本身在运行的时候去决定这个变量是什么类型,下面是基于 scala 和 kotlin 定义变量的实例。
因为类型推断机制给我们带来了很多优势,比如不用去记去写很多繁琐的字符,所以甲骨文意识到这点,并且开始向技术社区征求实现局部变量推断的意向调查,这说明在未来,java 将有机会引入这个机制。
java 即将引入节约时间成本的 repl
clojure、groovy、kotlin 以及 scala 都具有一个节约时间成本的命令行工具 read-eval-print-loop(简称 repl)。该工具允许在无需打包为类或者方法的前提下直接运行语句、如果我们需要立即获得反馈,那么这种方法显然更加简便易行。
好消息是,java 9 即将引入 longtools 软件包,而 repl 正是其中的组成部分,该工具将允许我们评估声明、语句及表达式,也能够在 jshell 持续读取用户输入内容、评估输入内容并显示输入值或者因输入造成的状态变更说明,进而快速完成代码原型设计。