1. 真香 | Java 9-15 新特性總結(jié)

        共 3431字,需瀏覽 7分鐘

         ·

        2021-03-01 23:24

        環(huán)境說明

        • OpenJdk 15

        51a3e0ee7abe02f90f0a763c03449014.webp

        • 開發(fā)工具 IDEA 2020.3.2

        07ea90d29532f251124a7267ae347c68.webp

        var 類型推斷 | since jdk10

        var 是 Java10 版本中新出的特性,用它來定義局部變量。var 不是關(guān)鍵字,相當(dāng)于一種動態(tài)類型,編譯器根據(jù)變量所賦的值來推斷類型。所以必須在定義變量的時候賦初始值。

        ?@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墓ぷ髦?,有時候需要用到一大段的字符串,這些字符串需要換行,需要排版,需要轉(zhuǎn)義。在一個文本編輯器中,這當(dāng)然是非常容易的事情。但是在 java 代碼中,就是一個噩夢了。而新的文本塊使用"""這個符號,進(jì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)我們需要判斷某天是否是工作日時候,需要大量的重復(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á)式簡化如上邏輯
        @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)建一個集合(例如,List 或 Set ),并直接用一些元素填充它。實(shí)例化集合,幾個 “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)建一種類中是“字段,只是字段,除了字段什么都沒有”的類。通過對類做這樣的聲明,編譯器可以通過自動創(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ū)ο缶幊痰囊粋€重要指標(biāo)嗎?為什么要限制可擴(kuò)展性呢?其實(shí),面向?qū)ο缶幊痰淖罴褜?shí)踐之一,就是要把可擴(kuò)展性的限制在可以預(yù)測和控制的范圍內(nèi),而不是無限的可擴(kuò)展性。

        • 通過 sealed 定義接口或者抽象類
        public?sealed?interface?Pet?permits?Cat?{
        }
        • 分配權(quán)限的子類可以正常的實(shí)現(xiàn)此接口
        public?final?class?Cat?implements?Pet?{
        }
        • 若沒有子類沒有分配權(quán)限,則編譯直接報錯
        0fb70a1fe0d42ea9eee18b43460c46a7.webp

        往期推薦

        產(chǎn)品炸了 | ?微信即將下線模板消息

        RSocket | 替代 REST 的不二選擇

        久等 | Spring Cloud Alibaba 2.2.4 發(fā)布

        2021 首發(fā) | Spring Boot 2.4.2 發(fā)布

        后門 | Nacos 被爆嚴(yán)重安全漏洞


        瀏覽 64
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 激情五月色综合国产精品 | 欧美三级 | 深夜福利视频一区二区 | 琪琪大香蕉| yw.139尤物在线精品视频 |