共计 3257 个字符,预计需要花费 9 分钟才能阅读完成。
Java 9 新特性
Java9 在语言上并没有添加太多的新特性,但在使用、性能上做了很改进。
一、模块间引用
Java9 添加了模块化的概念,使得之前的控制访问权限有了改变。之前:
public
protect
(default,package)
private
Java9
public to everyone
public but only for specific user
public within a module
protect
(default,package)
private
可以看到,对 public 类又做了进一步的限制,主要是对模块间的依赖做出限制,使得模块能够控制那些 public 类型能够被其他模块读取,以及该模块需要使用其他模块的类型。
如何定义模块
在 src 根目录下,创建 module-info.java:
// 该模块的名称为 module.one
module module.one {
// 该包下的所有 public 类型对其他模块可见
export package.name;
// 该 public 类型对其他模块可见
export class.name;
}
// 该模块的名称为 module.two
module module.two {
// 该模块将引用模块 1
// 该模块将能够使用模块 1 所开放的 public 类型
// 其他的 pubic 类型将不可见
require module.one;
}
以上是最简单的模块使用方式。
二、多版本 jar 包支持
即在不同 java 版本下,执行相应版本的代码。比如 DateUtil.java,若在 java7 环境下,将执行 java7 的代码,在 java8 的环境下,将执行 java8 的代码。在发布新版本的 java 后,用户可能不会升级到新环境,但是项目可能会开始逐步升级到新版本,来提前适应即将到来的环境。此时就要对多个版本的支持。
实现
$ javac –release 11 java11/com/xiao/test/Tester.java
$ javac –release 8 java8/com/xiao/test/Tester.java
$ tree
.
├── java11
│ └── com
│ └── xiao
│ └── test
│ ├── Tester.class
│ └── Tester.java
└── java8
└── com
└── xiao
└── test
├── Tester.class
└── Tester.java
8 directories, 4 files
$ jar -v -c -f multiversion.jar -C java8 com/xiao/test/Tester.class –release 11 -C java11 com/xiao/test/Tester.class
已添加清单
正在添加: com/xiao/test/Tester.class(输入 = 428) (输出 = 296)(压缩了 30%)
正在添加: META-INF/versions/11/com/xiao/test/Tester.class(输入 = 429) (输出 = 296)(压缩了 31%)
$ ls
java11 java8 multiversion.jar
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java8
$ /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java11
三、Interface 增强(可添加私有方法)
public interface PrivateMethod {
// java7 以前
// 默认为 public static finally
String NAME = “xiao”;
// 默认为 public
String get();
// java8
default void giveMyMoney() {
System.out.println(“No way!!!”);
}
static void makeFriend() {
System.out.println(“Hello, my friend.”);
}
// java9
private void show() {
System.out.println(“Nobody can find me.”);
}
}
四、JShell
提供互交式的工具。
$ jshell
| 欢迎使用 JShell — 版本 11.0.1
| 要大致了解该版本, 请键入: /help intro
jshell> /help intr
|
| intro
| =====
|
| 使用 jshell 工具可以执行 Java 代码,从而立即获取结果。
| 您可以输入 Java 定义(变量、方法、类等等),例如:int x = 8
| 或 Java 表达式,例如:x + x
| 或 Java 语句或导入。
| 这些小块的 Java 代码称为“片段”。
|
| 这些 jshell 工具命令还可以让您了解和
| 控制您正在执行的操作,例如:/list
|
| 有关命令的列表,请执行:/help
jshell> System.out.println(“The first time use jshell”);
The first time use jshell
jshell> String a = “xiao”
a ==> “xiao”
jshell> System.out.println(“name” + a)
namexiao
jshell> System.out.println(“name:” + a)
name:xiao
jshell>
五、try/catch 增强
Java6 以及之前的版本中,在使用一些资源时,通常会使用 try/catch 语句,并且在 finally 语句中来关闭资源,Java7 做了改进,Java9 也做了一点改进。
public class TryCatchImprove {
public static void main(String[] args) {
// Java 6 or early
// 使用的资源,建议都在 finally 块中关闭
InputStreamReader inputStream7 = new InputStreamReader(System.in);
try {
int i = inputStream7.read();
} catch (IOException ie) {
ie.printStackTrace();
} finally {
try {
inputStream7.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
// Java 7,8
// 当有多个资源被使用时,括号中使用 ; 分割,不再需要 finally 语句块
try (InputStreamReader inputStream8 = new InputStreamReader(System.in)) {
int i = inputStream8.read();
} catch (IOException ie) {
ie.printStackTrace();
}
// Java 9
// 能够直接在 try 的括号中使用变量,多个变量时用 ; 分割
InputStreamReader inputStream9 = new InputStreamReader(System.in);
try (inputStream9) {
int i = inputStream9.read();
} catch (IOException ie) {
ie.printStackTrace();
}
}
}
参考
更多更详细的特性,可以参照以下:
Oracle
What’s New in Oracle JDK 9:https://docs.oracle.com/javas…
Java Language Updates:https://docs.oracle.com/javas…
Blog
NewImport:http://www.importnew.com/2452…
http://www.runoob.com/java/ja…