1. 程式人生 > 程式設計 >JDK12的五大重要新特性

JDK12的五大重要新特性

JDK12的五大重要新特性

Java12在March 19,2019釋出了。

在2017年釋出Java 9之後,Java平臺釋出節奏已從每3年以上的主要版本轉變為每6個月釋出一次功能。現在,每年的3月和9月都會發布新的版本功能。 從而提供了更細化,更快和可管理的版本更新。

這是一個好訊息,不好的就是大家會覺得JDK的版本更新太快了。

什麼?JDK12已經出來了?

什麼?9月份要出JDK13了?

什麼?我還在用JDK8?

廢話少說,我們來看下JDK12的五個比較重要的新特性:

  1. 引入JVM常量API
  2. 擴充套件了switch語句
  3. 支援Unicode 11.0
  4. 為日本Reiwa Era提供了方形字元支援
  5. NumberFormat增加了對以緊湊格式格式化數字的支援

引入JVM常量API

每個Java類檔案都有一個常量池,該池儲存該類中位元組碼指令的操作。廣義上講,常量池中的條目要麼描述執行時artifacts(例如類和方法),要麼描述簡單值(例如字串和整數)。

所有這些條目都稱為可載入常量,因為它們可以用作ldc指令的引數(“載入常量”)。它們也可能出現在invokedynamic指令的引導方法的靜態引數列表中。執行ldc或invokedynamic指令會導致將可載入常量解析為標準Java型別(如Class,String或int)的“實時”值。

處理類檔案的程式需要對位元組碼指令進行建模,然後對可載入常量進行建模。但是,使用標準Java型別對可載入常量進行建模是不夠的。

描述一個字串(一個CONSTANT_String_info條目)的可載入常量可能是可以接受的,因為生成一個“live” String物件是很簡單的,但是對於描述一個類(一個CONSTANT_Class_info條目)的一個可載入常量來說,這是有問題的,因為生成一個“live”類物件依賴於類載入的正確性和一致性。

在實際應用中,類載入具有許多環境依賴性和失敗的情況,例如:所需的類不存在或請求者可能無法訪問;類載入的結果隨上下文而變化;載入類具有副作用;有時根本不可能載入類。

因此,處理可載入常量的程式如果能夠操縱類和方法,並且以純名義上的符號形式操縱諸如方法控制程式碼和動態計算的常量之類的artifacts,則它們將變得更加簡單。

JDK12在新包java.lang.invoke.constant中定義了一系列基於值的符號引用(JVMS 5.1)型別,它們能夠描述每種可載入常量。符號引用以純字面的形式描述了可載入常量,與類載入或可訪問性上下文分開。某些類可以充當自己的符號引用(例如String);對於可連結常量,JDK12定義了一系列符號引用型別(ClassDesc,MethodTypeDesc,MethodHandleDesc和DynamicConstantDesc),來包含描述這些常量的資訊。

擴充套件了switch語句

這是JEP 325提出的一個預覽版本的預發特性。現在被JDK13的 JEP 354替代了。

簡單點講就是擴充套件了switch語法,可以用作語句或表示式。

老的寫法:

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
複製程式碼

新的寫法:

switch (day) {
    case MONDAY,FRIDAY,SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY,SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
複製程式碼

還可以有返回值:

int numLetters = switch (day) {
    case MONDAY,SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY,SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};
複製程式碼

支援Unicode 11.0

JDK 12版本包含對Unicode 11.0.0的支援。 在支援Unicode 10.0.0的JDK 11發行之後,Unicode 11.0.0引入了JDK 12現在包含的以下新功能:

  • 684個新字元
  • 11個新blocks
  • 7個新指令碼。

為日本Reiwa Era提供了方形字元支援

簡單點說就是日本朝代更替,造了一個新字(Reiwa 令和)。所以需要Unicode的支援。

Unicode聯盟為這個字保留程式碼:U+32FF。

現在的日本朝代叫:(Heisei 平成)。 是指日本歷史的一段時期,對應於明仁天皇從1989年1月8日至至2019年4月30日退位。

他的兒子Naruhito皇太子於5月1日成為新的天皇后,改朝代名為:Reiwa。

NumberFormat增加了對以緊湊格式格式化數字的支援

NumberFormat增加了以緊湊格式格式化數字的支援。 緊湊的數字格式是指數字的簡短形式或易於理解的形式。 例如,在en_US語言環境中,根據NumberFormat.Style指定的樣式,可以將1000格式化為“ 1K”,將1000000格式化為“ 1M”。 緊湊數字格式由LDML的緊湊數字格式規範定義。 若要獲取例項,請使用NumberFormat給出的工廠方法之一來進行緊湊數字格式化。 例如:

NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US,NumberFormat.Style.SHORT);
String result = fmt.format(1000);
複製程式碼

上面的示例生成“ 1K”。

更多教程請參考 flydean的部落格