java11 var 关键字和 cli 方式执行

java11 在语法上支持动态类型推断,还支持在命令行运行源码。其实var关键字在java10已经支持了,而且从java9开始就添加了jshell命令等,不过9和10都已经夭折了,而且现在java11都更新过一个版本了,我们大大方方的讨论java11吧。

动态类型推断,这个术语可能不严谨,openjdk网站上描述是Local-Variable Type Inference(本地变量类型推断),参考 JEP 286

在命令行运行源码,不是指jshell,而是Launch Single-File Source-Code Programs(启动单个源码程序),java命令直接启动源码文件,还有shebang特性,参考 JEP 330

看个简单例子:创建Hello.java文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.ArrayList;
public class Hello {
public static void main(String[] args) {
var list = new ArrayList<>();
var hi = "hello world";
var bool = true;
var i = 1;
list.add(hi);
list.add(bool);
list.add(i+i);
System.out.println(list);
}
}

可以看到代码中使用了var关键字,即使用了动态类型推断特性。
然后,在命令行中执行java Hello.java命令,输出[hello world, true, 2]

注意:如果你的系统中安装了多个java版本,请确保java11为当前默认的java版本。比如,也安装了java8,而且平时默认是java8,需要临时改一下:在命令行中设置JAVA_HOMEjdk11的安装目录,然后把新JAVA_HOME/bin路径放到当前PATH的环境变量的最前面,这样就可以了。

下面看一看Shebang特性:

把Hello.java复制一份为Hello,cp Hello.java Hello,然后在Hello的文件头添加一行内容
#!/usr/bin/java --source 11
(注意,不要直接修改Hello.java文件)。此时文件内容形如:

1
2
3
4
5
6
#!/usr/bin/java --source 11
import java.util.ArrayList;
public class Hello {
public static void main(String[] args) {
var list = new ArrayList<>();
... ...

把Hello设置为可执行文件chmod +x Hello,然后执行

1
./Hello

可以看到命令正常运行,输出[hello world, true, 2]

参考