java9特性

语法变更

钻石操作符

在Java8中,匿名内部类不支持使用钻石操作符:

Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return 0;
    }
};

在Java9中,已经支持匿名内部类泛型推断:

Comparator<String> comparator = new Comparator<>() {
    @Override
    public int compare(String s1, String s2) {
        return 0;
    }
};

try 语句升级

下划线标识符限制

Java8可以单独使用下划线定义变量,而Java9中则不允许了。

API变更

接口中的私有方法

Java9中可以在Interface中定义private方法:

String底层存储结构

String的存储结构由 char[] 变为了 byte[]

Stream API新增方法

Stream新增四个API方法:

此外,Stream的一些方法实现了与Optional的结合:

InputStream新增API

InputStream新增transferTo方法,此方法会创建缓冲区使用while循环将inputStream中的内容拷贝到outputStream中:

创建只读集合的方法

JShell

可以运行java片段的shell窗口。支持的主要命令:

  1. /list 列出执行的所有片段

  2. /imports 列出已经导入的包

  3. /edit 编辑所有片段

  4. /open 文件地址 调用本地的某个java脚本

  5. /exit

模块化

谈到Java9大家往往第一个想到的就是Jigsaw项目(后改名为Modularity)。众所周知,Java已经发展超过20年(95年最初发布),Java和相关生态在不断丰富的同时也越来越暴露出一些问题:

  1. Java运行环境的膨胀和臃肿。每次JVM启动的时候,至少会有30~ 60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去(而模块化可以根据模块的需要加载程序运行需要的class)

  2. 当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了Java 开发和运行效率的提升。

  3. 很难真正地对代码进行封装,而系统并没有对不同部分(也就是JAR文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的API.

什么是模块化:

  1. 模块化是在package外的新的一层,一个src目录只能声明为一个模块

  2. 在src根目录建立 module-info.java,声明module

  3. 模块之间的可访问性是所使用的模块和使用模块之间的双向协议,在该文件中可以声明当前模块的依赖,以及当前模块暴露的包

IDEA Jdk9 模块化工程

定义service模块:

定义api模块,依赖service模块:

Maven + Jdk9 模块化工程

Maven 本身对模块化的支持已经非常好了,引入java模块化,主要是对包中的类进一步进行访问权限控制。

最后更新于

这有帮助吗?