真香 | Java 9-15 新特性總結(jié)
環(huán)境說明
OpenJdk 15

開發(fā)工具 IDEA 2020.3.2

var 類型推斷 | since jdk10
var 是 Java10 版本中新出的特性,用它來定義局部變量。var 不是關(guān)鍵字,相當(dāng)于一種動(dòng)態(tài)類型,編譯器根據(jù)變量所賦的值來推斷類型。所以必須在定義變量的時(shí)候賦初始值。
?@Test
?public?void?testJDK10VarLocalVariable(){
??var?num1?=?1000;
??var?num2?=?1.001;
??var?str?=?"hello?var";
??var?list?=?new?ArrayList<>();
??var?map?=?new?HashMap<>();
?}
?@Test
?public?void?testNoramlVariable(){
??int?num1?=?1000;
??double?num2?=?1.001;
??String?str?=?"hello?var";
??List?list?=?new?ArrayList<>();
??Map?map?=?new?HashMap();
?}
文本塊 | since jdk13
在我們?nèi)粘5墓ぷ髦校袝r(shí)候需要用到一大段的字符串,這些字符串需要換行,需要排版,需要轉(zhuǎn)義。在一個(gè)文本編輯器中,這當(dāng)然是非常容易的事情。但是在 java 代碼中,就是一個(gè)噩夢(mèng)了。而新的文本塊使用"""這個(gè)符號(hào),進(jìn)行拼接。
- 簡(jiǎn)化表達(dá)多行字符串,不需要轉(zhuǎn)義;
- 增強(qiáng)可讀性;
?@Test
?public?void?testNormalString(){
??String?text?=?"{"?+?"\n"
????+"????\"username\":?\"lengleng\",\n"
????+"????\"password\":?\"123456\"?\n"
????+"}";
??System.out.println(text);
?}
?@Test
?public?void?testNewJdk13TextBlock(){
??var?text?=?"""
???????????????{
????????????????????"username":?"lengleng",
????????????????????"password":?"123456"
???????????????}
???????????????""";
??System.out.println(text);
?}
switch 表達(dá)式 | since jdk12
- 如下邏輯,當(dāng)我們需要判斷某天是否是工作日時(shí)候,需要大量的重復(fù)的 case 邏輯
?@Test
?public?void?testNormalSwitch()?{
??int?day?=?2;
??switch?(day)?{
??case?1:
??case?2:
??case?3:
??case?4:
??case?5:
???System.out.println("workday");
??case?6:
??case?7:
???System.out.println("weekend");
??default:
???System.out.println("invalid");
??}
?}
- jdk12 可以通過的 switch 表達(dá)式簡(jiǎn)化如上邏輯
@Test
?public?void?testNewJdk12MultiSwitch()?{
??var?day?=?2;
??switch?(day)?{
??case?1,?2,?3,?4,?5?->?System.out.println("workday");
??case?6,?7?->?System.out.println("weekend");
??default?->?System.out.println("invalid");
??}
?}
集合工廠 | since jdk9
- 通常希望在代碼中創(chuàng)建一個(gè)集合(例如,List 或 Set ),并直接用一些元素填充它。實(shí)例化集合,幾個(gè) “add” 調(diào)用,使得代碼重復(fù)。
?@Test
?public?void?testNormal(){
??List<String>?fruitsTmp?=?new?ArrayList<>();
??fruitsTmp.add("apple");
??fruitsTmp.add("banana");
??fruitsTmp.add("orange");
??Map<Integer,?String>?numbersTmp?=?new?HashMap<>();
??numbersTmp.put(1,?"one");
??numbersTmp.put(2,?"two");
??numbersTmp.put(3,?"three");
?}
- 現(xiàn)在可以通過 of 方法來快速構(gòu)建集合類型
@Test
?public?void?testNewJdk9()?{
??var?fruits?=?List.of("apple",?"banana",?"orange");
??var?numbers?=?Map.of(1,?"one",?2,?"two",?3,?"three");
?}
record 記錄 | since jdk14
Records 的目標(biāo)是擴(kuò)展 Java 語言語法,Records 為聲明類提供了一種緊湊的語法,用于創(chuàng)建一種類中是“字段,只是字段,除了字段什么都沒有”的類。通過對(duì)類做這樣的聲明,編譯器可以通過自動(dòng)創(chuàng)建所有方法并讓所有字段參與 hashCode()等方法。干掉 lombok 只需要通過 record 聲明即可完成實(shí)體字段的 get 和構(gòu)造器方法。
public?record?Demo(String?username,?String?password)?{
}
?@Test
?public?void?testJdk15Record()?{
??var?demo?=?new?Demo("lengleng",?"123456");
??System.out.println(demo.password());
??System.out.println(demo.username());
?}
接口私有方法 | since jdk9
Java8 帶來了許多改變,其中之一就是 default 修飾的接口方法。這些方法改變了我們已知的接口,現(xiàn)在我們能夠在接口中定義默認(rèn)實(shí)現(xiàn)方法。如果你大量使用 default 方法在你的應(yīng)用接口中,現(xiàn)在可以通過 JDK9 的接口私有方法來重構(gòu)。
public?interface?PrivateInterface?{
?private?void?printF(){
??System.out.println("lengleng");
?}
?default?void?getPassword(){
??printF();
??System.out.println("123456");
?}
}
?@Test
?public?void?testGetPassword()?{
??var?privateInterface?=?new?PrivateInterfaceImpl();
??privateInterface.getPassword();
?}
Sealed 類封閉 | since jdk15
可擴(kuò)展性不是面向?qū)ο缶幊痰囊粋€(gè)重要指標(biāo)嗎?為什么要限制可擴(kuò)展性呢?其實(shí),面向?qū)ο缶幊痰淖罴褜?shí)踐之一,就是要把可擴(kuò)展性的限制在可以預(yù)測(cè)和控制的范圍內(nèi),而不是無限的可擴(kuò)展性。
- 通過 sealed 定義接口或者抽象類
public?sealed?interface?Pet?permits?Cat?{
}
- 分配權(quán)限的子類可以正常的實(shí)現(xiàn)此接口
public?final?class?Cat?implements?Pet?{
}
- 若沒有子類沒有分配權(quán)限,則編譯直接報(bào)錯(cuò)

往期推薦
久等 | Spring Cloud Alibaba 2.2.4 發(fā)布
2021 首發(fā) | Spring Boot 2.4.2 發(fā)布
