本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。
不可变集合工厂方法
Java 9 为创建特殊的不可变集合提供了一些工厂方法:
1 | Set<Integer> ints = Set.of(1, 2, 3); |
需要注意这些方法创建的集合是不可变的,它们有以下特性:
- 由于不可变,因此无法添加、修改和删除其元素,否则抛出
UnsupportedOperationException
异常 - (创建时)不允许存在
null
元素,否则抛出NullPointerException
异常 - 集合是否可序列化取决于所有元素是否可序列化
私有接口方法
Java 8 新特性允许我们在接口中添加默认(default
)方法和静态(static
)方法。 但是,前者是供实现类调用,而后者是供其他类调用的,总之,是供“外部”调用的。可是,加入两者后,引发了一个问题:在不将方法暴露为 API 的情况下,代码无法复用。因此,Java 9 可以向接口添加私有辅助方法来解决此问题:
1 | public interface MyInterface { |
更简洁的TWR语句
如果已经有了一个 final
或事实 final
的资源变量,则可以直接使用,而不必再在 try
子句中声明新的变量。但是,还是需要将这些变量列在 try
子句中。
1 | // New and improved try-with-resources statement in Java SE 9 |
REPL (JShell)
Java 9 之前,要想体验 Java,通常不得不写一个“Hello World!”类——里面充斥着各种基础概念、语法及固定写法等等,对初学者很不友好,刚开始体验就弄得一头雾水。而其他诸如 Python、Node.js 等主流的语言都自带交互式命令行程序,可以很轻松地体验及测试一些特性。
幸运的是,Java 9 加入了自己的交互式命令行程序——JShell——我们可以在命令行/终端中通过输入 jshell 进入。使用 /help
命令可查看其帮助系统,这样就可以入手体验了。最后,可使用 /exit
命令,或 Ctrl + D
退出。
几乎与 Node.js 一样,交互命令只是换了个前缀,退出的快捷键都一样——当然大多交互命令行程序都很类似啦!
其他更新
下划线不再是一个合法的标识符,它将导致编译失败。
钻石语法允许用于匿名内部类。比如:Map<String,String>map9= newHashMap<>(){};
私有实例方法上允许使用 @SafeVarargs
注释。 它只能应用于不能被覆盖的方法。 其中包括静态方法、final
实例方法以及 Java SE 9 中新增的私有实例方法。
多版本兼容 Jar 包。可以将 Jar 包编译为新旧版本的 Java 都可用的版本。
模块系统……