java 9 10 11 12 13新特性,这里为你总结全了( 三 )

  • -XX:+DisableExplicitGC:忽略代码中的 System.gc() 调用 。当用户在代码中调用 System.gc() 时会强制 Shenandoah 执行 STW Full GC,应禁用它以防止执行此操作,另外还可以使用 -XX:+ExplicitGCInvokesConcurrent,在 调用 System.gc() 时执行 CMS GC 而不是 Full GC,建议在有 System.gc() 调用的情况下使用 。
  • 不过目前 Shenandoah 垃圾回收器还被标记为实验项目,需要使用参数:- XX:+UnlockExperimentalVMOptions 启用 。更多有关如何配置、调试 Shenandoah 的信息,请参阅 henandoah wiki 。
    增加一套微基准套件
    Java 12 中添加一套新的基本的微基准测试套件,该套微基准测试套件基于 JMH(Java Microbenchmark Harness),使开发人员可以轻松运行现有的微基准测试并创建新的基准测试,其目标在于提供一个稳定且优化过的基准,其中包括将近 100 个基准测试的初始集合,并且能够轻松添加新基准、更新基准测试和提高查找已有基准测试的便利性 。
    微基准套件与 JDK 源代码位于同一个目录中,并且在构建后将生成单个 Jar 文件 。但它是一个单独的项目,在支持构建期间不会执行,以方便开发人员和其他对构建微基准套件不感兴趣的人在构建时花费比较少的构建时间 。
    要构建微基准套件,用户需要运行命令:make build-microbenchmark,类似的命令还有:make test TEST="micro:java.lang.invoke" 将使用默认设置运行 java.lang.invoke 相关的微基准测试 。关于配置本地环境可以参照文档 docs/testing.md|html 。
    Switch 表达式扩展(预览功能)
    Java 11 以及之前 Java 版本中的 Switch 语句是按照类似 C、C++ 这样的语言来设计的,在默认情况下支持 fall-through 语法 。虽然这种传统的控制流通常用于编写低级代码,但 Switch 控制语句通常运用在高级别语言环境下的,因此其容易出错性掩盖其灵活性 。
    在 Java 12 中重新拓展了 Switch 让它具备了新的能力,通过扩展现有的 Switch 语句,可将其作为增强版的 Switch 语句或称为 "Switch 表达式"来写出更加简化的代码 。
    Switch 表达式也是作为预览语言功能的第一个语言改动被引入新版 Java 中来的,预览语言功能的想法是在 2018 年初被引入 Java 中的,本质上讲,这是一种引入新特性的测试版的方法 。通过这种方式,能够根据用户反馈进行升级、更改,在极端情况下,如果没有被很好的接纳,则可以完全删除该功能 。预览功能的关键在于它们没有被包含在 Java SE 规范中 。
    在 Java 11 以及之前版本中传统形式的 Switch 语句写法如下:
    清单 1. Switch 语句示例
     
    int dayNumber;switch (day) { case MONDAY: case FRIDAY: case SUNDAY: dayNumber = 6; break; case TUESDAY: dayNumber = 7; break; case THURSDAY: case SATURDAY: dayNumber = 8; break; case WEDNESDAY: dayNumber = 9; break; default: throw new IllegalStateException("Huh? " + day);}上面代码中多处出现 break 语句,显得代码比较冗余,同时如果某处漏写一段 break 语句,将导致程序一直向下穿透执行的逻辑错误,出现异常结果,同时这种写法比较繁琐,也容易出问题 。
    换做 Java 12 中的 Switch 表达式,上述语句写法如下:
    清单 2. Switch 表达式示例
    int dayNumber = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; default -> throw new IllegalStateException("Huh? " + day);}使用 Java 12 中 Switch 表达式的写法,省去了 break 语句,避免了因少些 break 而出错,同时将多个 case 合并到一行,显得简洁、清晰也更加优雅的表达逻辑分支,其具体写法就是将之前的 case 语句表成了:case L ->,即如果条件匹配 case L,则执行 标签右侧的代码,同时标签右侧的代码段只能是表达式、代码块或 throw 语句 。为了保持兼容性,case 条件语句中依然可以使用字符 :,这时 fall-through 规则依然有效的,即不能省略原有的 break 语句,但是同一个 Switch 结构里不能混用 -> 和 :,否则会有编译错误 。并且简化后的 Switch 代码块中定义的局部变量,其作用域就限制在代码块中,而不是蔓延到整个 Switch 结构,也不用根据不同的判断条件来给变量赋值 。
    Java 11 以及之前版本中,Switch 表达式支持下面类型: byte、char、short、int、Byte、Character、Short、Integer、enum、tring,在未来的某个 Java 版本有可能会允许支持 float、double 和 long (以及上面类型的封装类型) 。
    引入 JVM 常量 API
    Java 12 中引入 JVM 常量 API,用来更容易地对关键类文件 (key class-file) 和运行时构件(artefact)的名义描述 (nominal description) 进行建模,特别是对那些从常量池加载的常量,这是一项非常技术性的变化,能够以更简单、标准的方式处理可加载常量 。


    推荐阅读