8 的语言特性和 API
的支持还没有完全覆盖但是 D8
已经为我们提供了部分核心的语言特性支持。
上篇文章很多人反馈 Java 8
版本已经太旧了Java
生态系统中的一部分部分在使用 Java 9 和 10 之后,開始迁移到 Java 11(Java 8 之后的第一个长期支持发布)很高兴上篇文章能有读者反馈,因为这样的反馈才有了这篇文章
foo.bar())。但是如果已经定义了一個 Closeable
对象那么在定义一个新的变量是多余的。因此如果已经有了有效的最终引用,那么这个版本允许您省略声明一个新变量
在 Java 7 中引入叻钻石操作,钻石操作简化了泛型初始化可以让代码更易读。
同样上面的方式完全是在 Java
编译器中实现的,因此生成的字节码就好像是顯式指定了 String
一样我们通过 javap
查看编译后的字节码。
因为字节码中没有什么特殊的地方D8
可以毫无问题地处理这个特性。
在接口中static
或 default
方法會由于重写导致重复的实现,如果这些方法是类的一部分而不是接口则可以提取这些函数为私有函数。在 Java 9
中为接口添加了用 private
修饰的私有方法
在 Java 1.1
中引入了嵌套类,但是不符合类规范或 JVM
不识别所以为了兼容这个问题,在源文件中的定义的嵌套类将按照一定的命名规则来创建一个源文件的兄弟类
我们可以看到生成了两个字节码文件,对于 JVM
而言他们是相互独立的,除了存在同一个包下这种处理看似没问題,但是当二者之间如果出现相互访问 private
方法的情况就会奔溃
从今天的角度来看,这对 JVM
来说至多只是一个小麻烦不过,对于 Android
这些合成訪问器方法增加了 dex
文件中的方法计数,增加 apk
大小降低类加载和验证的速度,将字段查找转换为方法调用同时也使性能降低
在 Java 11
中,更新叻类文件格式用来引入嵌套的概念来描述这些嵌套关系
遗憾的是 ART
现在还无法解析这种操作。
非常遗憾在我写这篇文章的时候还是没有支持。但是 ASM
(一个字节码操作库) 已经支持了这种 nestmates
(嵌套访问)D8
还没有支持,你可以在 上提出你对这个特性的 issue
随着 2019 年 3 月发布日期的到來,Java 12
离我们越来越近这个版本的语言特性和 API
已经开发了几个月。通过早期的访问构建我们今天可以下载并试用这些特性。
这两个特性唍全实现为 Java
编译器的一部分而没有任何新的字节码或 API
。
我们可以把这个类打包放到设备中安卓10运行不了低版本游戏
switch
表达式编写的返回語句,以及字符串中直接使用换行(以前可以使用 \n 转义字符)实现
D8 中,那么对于所有 API
级别来说都将承担一个巨大的负担而不仅仅是提供向后兼容性。