JDK12特性

JDK12特性

一、JAVA12概述

  2019年3月19日,java12正式发布了,总共有8个新的JEP(JDK Enhancement Proposals)

JDK 12 is the open-source reference implementation of version 12 of the Java SE12
Platform as specified by by JSR 386 in the Java Community Process.
JDK 12 reached General Availability on 19 March 2019. Production-ready binaries under
the GPL are available from Oracle; binaries from other vendors will follow shortly.
The features and schedule of this release were proposed and tracked via the JEP
Process, as amended by the JEP 2.0 proposal. The release was produced using the JDK
Release Process(JEP 3).

JAVA12的版本特性地址:http://openjdk.java.net/projects/jdk/12/

image.png

相关特性的介绍

189:Shenandoah:A Low-Pause-Time Garbage Collector(Experimental)
低暂停时间的GC http://openjdk.java.net/jeps/189
230:Microbenchmark Suite
微基准测试套件 http://openjdk.java.net/jeps/230
325:Switch Expressions(Preview)
switch表达式 http://openjdk.java.net/jeps/325
334:JVM Constants API
JVM常量API http://openjdk.java.net/jeps/334
340:One AArch64 Port,Not Two
只保留一个AArch64实现 http://openjdk.java.net/jeps/340
341:Default CDS Archives
默认类数据共享归档文件 http://openjdk.java.net/jeps/341
344:Abortable Mixed Collections for G1
可中止的G1 Mixed GC http://openjdk.java.net/jeps/344
346:Promptly Return Unused Committed Memory from G1
G1及时返回未使用的已分配内存 http://openjdk.java.net/jeps/346

二、语法层次的改变

1. switch 表达式(预览)

  传统的switch声明语句(switch statement)在使用中有一些问题:

  1. 匹配自上而下,若无break, 后面的case语句都会执行;
  2. 不同的case语句定义的变量名不能重复;
  3. 不能在一个case里写多个执行结果一致的条件;
  4. 整个switch不能作为表达式返回值;

Java 12提供增强版的 switch 语句或称为 "switch 表达式"来写出更加简化的代码。

什么是预览?

  Switch 表达式也是作为预览语言功能的第一个语言改动被引入新版 Java 中来的,这是一种引入新特性的测试版的方法。通过这种方式,能够根据用户反馈进行升级、更改.如果没有被很好的接纳,则可以完全删除该功能。预览功能的没有被包含在Java SE 规范中。也就时说: 这不是一个正式的语法,是暂时进行测试的一种语法.

switch详细语法

  扩展的 switch 语句,不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以,使用传统的 switch 语法,或者使用简化的“case L ->”模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch 中的模式匹配(JEP 305)做好准备。

  • 使用 Java 12 中 switch 表达式的写法,省去了 break 语句,避免了因少写 break 而出错。
  • 同时将多个 case 合并到一行,显得简洁、清晰也更加优雅的表达逻辑分支,其具体写法就是将之前的 case 语句表成了:case L ->,即如果条件匹配 case ,则执行标签右侧的代码 ,同时标签右侧的代码段只能是表达式、代码块或 throw 语句。
  • 为了保持兼容性,case 条件语句中依然可以使用字符 : ,这时 fall-through 规则依然有效的,即不能省略原有的 break 语句,但是同一个 switch 结构里不能混用 -> 和 : ,否则会有编译错误。并且简化后的 switch 代码块中定义的局部变量,其作用域就限制在代码块中,而不是蔓延到整个 Switch 结构,也不用根据不同的判断条件来给变量赋值。

JAVA12之前switch语法的使用:

    public static void main(String[] args) {
   
        Month month=Month.APRIL;
        String season;
        switch (month){
   
            case DECEMBER:
            case JANUARY:
            case FEBRUARY:
                season="梅";
                break;
            case MARCH:
            case APRIL:
            case MAY:
                season="兰";
                break;
            case JUNE:
            case JULY:
            case AUGUST:
                season="菊";
                break;
            case SEPTEMBER:
            case OCTOBER:
            case NOVEMBER:
                season="竹";
                break;
            default:
                throw new RuntimeException("NoSuchMonthException");
        }
        System.out.println(season);
    }

JAVA12之后,switch语法的用法:

    public static void main(String[] args) {
   
        Month month=Month.APRIL;
        String season;
        switch (month){
   
            case DECEMBER,JANUARY,FEBRUARY ->season="梅";
            case MARCH,APRIL,MAY -> season="兰";
            case JUNE,JULY,AUGUST -> season="菊";
            case SEPTEMBER,OCTOBER,NOVEMBER -> season="竹";
            default -> throw new RuntimeException("不支持此参数");
        }
        System.out.println(season);
    }

  似乎可以看出,JAVA开发者或将逐渐的从复杂繁琐的底层抽象代码的编写中解放出来,编写一些更高层次更优雅的代码. 减少出错,提高开发效率. 目前switch表达式支持下面的数据类型, byte char short int Byte, Character,Short,Integer,enum,String,未来是否会支持 float double和long? 目前本版本未对支持的数据类型进行拓展.

三、API层次的改变

1.支持数字压缩格式化

  NumberFormat 添加了对以紧凑形式格式化数字的支持。紧凑数字格式是指以简短或人类可读形式表示的数字。例如,在en_US语言环境中,1000可以格式化为“1K”,1000000可以格式化为“1M”,具体取决于指定的样式NumberFormat.Style。

var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA,
NumberFormat.Style.SHORT);
System.out.println(cnf.format(1_0000));
System.out.println(cnf.format(1_9200));
System.out.println(cnf.format(1_000_000));
System.out.println(cnf.format(1L << 30));
System.out.println(cnf.format(1L << 40));
System.out.println(cnf.format(1L << 50
  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值