<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我還在生產(chǎn)玩 JDK7,JDK 15 卻要來了!|新特性嘗鮮

          共 4663字,需瀏覽 10分鐘

           ·

          2020-08-09 03:15

          前兩天發(fā)的這篇文章:《IntelliJ IDEA 2020.2重磅發(fā)布!全面支持Github PR。真香版本?》中介紹到:盡管Java 15的發(fā)布將在9月進(jìn)行,但I(xiàn)ntelliJ IDEA 2020.2已經(jīng)支持 Java 15的新特性了。

          自從 JDK9 之后,每年 3 月與 9 月 JDK 都會發(fā)布一個新的版本,而2020 年 9 月即將引來 JDK15。

          恰巧 IDEA 每四五個月會升級一個較大的版本,每次升級之后都會支持最新版本 JDK 引入的新功能。

          這幾天升級了 IDEA,順便體驗(yàn)了一下 JDK15 的新特性。

          雖然我知道你們可能跟我一樣JDK8 都還沒用熟,但是無妨,看看新版本 JDK 來酸一下。

          img

          Text Blocks 最終定板

          之前版本的 JDK,如果我們需要插入 HTMLXML,SQLJSON 片段,非常麻煩,需要對里面符號進(jìn)行各種轉(zhuǎn)義。

          所以我每次都會在其他編輯器將 HTML ,XML 等編輯好,然后直接復(fù)制到 IDEA 中,IDEA 自動會對這些字符轉(zhuǎn)義。

          img

          每次復(fù)制進(jìn)去就變成上圖的效果,如果上面字符再多點(diǎn),閱讀起來就會更難,并且難以維護(hù)。

          所幸 IDEA 提供了一個 Inject Language 功能,我們可以在里面快速方便的編輯。

          img

          Java 開發(fā)者也關(guān)注到這個問題,他們在 JDK13 引入的一個新的預(yù)覽特性「Text Blocks」,可以使用三引號將復(fù)雜的字符串賦值,從而讓我們從各種轉(zhuǎn)義中解脫出來,可以更加方便的編輯字符串。

          這個功能在其他語言還是比較常見的,比如 Python 等。

          Text Blocks 新功能在 JDK14 再次以預(yù)覽功能引入,最終在 JDK15 成為新版本的正式功能。

          下面我們來對比一下使用 Text Blocks 與之前區(qū)別:

          Html
          SQL
          JS

          Records (Second Preview)

          JDK14 引入一個新的預(yù)覽特性 record 語法,可以快速創(chuàng)建一個純數(shù)據(jù)類,并且不用去生成 gettertoString 等。

          使用下面的語法就可以快速創(chuàng)建一個數(shù)據(jù)類:

          public?record?Point(int?x,int?y)?{
          }

          JDK15 是 record 這個語法的第二次預(yù)覽,這個版本增加一個新的功能 「local record」,可以在一個方法在快速創(chuàng)建一個類,以便于方法中業(yè)務(wù)邏輯計(jì)算。

          在以下示例中,使用本地記錄 MerchantSales 對商人和每月銷售額的匯總進(jìn)行建模,使用此記錄可提高以下流操作的可讀性:

          下面例子的中我們新建一個類 MerchantSales,然后按照銷售人員對每月的銷售額匯總排序。

          List?findTopMerchants(List?merchants,?int?month)?{
          ????//?Local?record
          ????record?MerchantSales(Merchant?merchant,?double?sales)?{}

          ????return?merchants.stream()
          ????????.map(merchant?->?new?MerchantSales(merchant,?computeSales(merchant,?month)))
          ????????.sorted((m1,?m2)?->?Double.compare(m2.sales(),?m1.sales()))
          ????????.map(MerchantSales::merchant)
          ????????.collect(toList());
          }

          原先如果需要使用這種功能,我們不得不創(chuàng)建一個內(nèi)部類,后續(xù)可能再也不會用到,使用 local record就解決這個尷尬的問題。

          除了 local record 我們還可以創(chuàng)建 local enums 以及 local interface。

          //?local?enums
          public?void?organisePeople(List?people)?{
          ????enum?Role?{
          ????????Employee,?Customer,?Both,?None
          ????}
          ????HashMap>?peopleByRole?=?new?HashMap<>();
          ????people.stream()
          ????????????.filter(Person::isCustomer)
          ????????????.forEach(person?->?peopleByRole.computeIfAbsent(Role.Customer,?role?->?new?ArrayList<>())
          ????????????????????.add(person));
          ????//?其他業(yè)務(wù)邏輯

          }
          //?local?interface
          public?void?localInterface()?{
          ????interface?MyInterface?{
          ????????void?doSomething();
          ????}
          ????MyInterface?testInterface?=?new?MyInterface()?{
          ????????@Override
          ????????public?void?doSomething()?{
          ????????????System.out.println("Hello?World!");
          ????????}
          ????};
          ????//?其他業(yè)務(wù)邏輯

          }

          最后使用這個特性需要注意一點(diǎn),local record , local enums ,local interface 創(chuàng)建都是一個局部變量,是不能被傳遞其他方法引用。

          Pattern Matching for instanceof (Second Preview)

          我們應(yīng)該都看到過下面這種代碼:

          if?(obj?instanceof?String)?{
          ????String?str?=?(String)?obj;
          ????//?use?str
          }

          上面代碼意圖非常簡單,當(dāng) obj 對象是 String 類,就將其強(qiáng)制轉(zhuǎn)換,然后進(jìn)行其他業(yè)務(wù)操作。

          這種寫法,類型轉(zhuǎn)換還是比較繁瑣,Pattern Matching for instanceof 這個新語法特性,可以幫我們省略這種類型轉(zhuǎn)換動作。這是一個在 JDK14 引入一個預(yù)覽特性,JDK 15 開始第二次預(yù)覽。

          上面的代碼使用 pattern matcher,就可以被修改如下:

          if?(obj?instanceof?String?s)?{
          ????s.contains("T");
          }?else?{
          ????//?編譯錯誤
          ????//s.contains("T");
          }

          另外如果在 IDEA 中還可以提示我們將代碼轉(zhuǎn)化成 pattern matcher

          img

          大家應(yīng)該都看過 Effective Java 這本神書吧,里面第八條關(guān)于 Equals 有一個例子:

          img

          使用 pattern matcher 我們就可以使用下面更加清晰的代碼代替:

          img

          Sealed Classes (Preview)

          Java 中一個正常普通類/接口允許被其他子類繼承/實(shí)現(xiàn),但是有時在日常開發(fā)中,我們可能希望只有特定的類才能繼承擴(kuò)展。

          現(xiàn)有的 Java 語法中存在一些方法,可以限制子類擴(kuò)展,比如說:我們可以使用 final 修飾類

          public?final?class?String

          不過這樣之后,我們就沒辦法再繼承這個類。

          其次我們可以限制的類的范圍,比如說不使用 public 修飾類/接口,即使用 default 范圍,這樣只有同一個包才能繼承/實(shí)現(xiàn)。

          interface?DefaultExample?{
          }

          不過使用這種方式,又很尷尬,這個類就無法被其他包使用。

          為了解決上述問題,JDK 15 引入一個新的預(yù)覽特性 Sealed Classes,即可以限定類的擴(kuò)展,也可以被外部使用。

          public?sealed?class?Shape
          ????permits?Circle,?Rectangle,?Square?
          {...}

          使用 sealed 修飾之后,Shape 類只能被 Circle,Rectangle,Square繼承,再也不能被其他類繼承。

          同時 Shape 的子類存在一些限制,必須使用 final 修飾,表明這個類無法再被擴(kuò)展:

          public?final?class?Circle?extends?Shape?{...}

          或者繼續(xù)使用 sealed 表示子類只能被指定類繼承:

          public?sealed?class?Rectangle?extends?Shape?
          ????permits?TransparentRectangle,?FilledRectangle?
          {...}
          public?final?class?TransparentRectangle?extends?Rectangle?{...}

          又或者說使用 non-sealed 表明這個子類不限制子類擴(kuò)展,可以被其他任何類擴(kuò)展實(shí)現(xiàn)。

          另外 sealed class 還可以跟上述 record 語法一起使用。

          public?sealed?interface?Expr
          ????permits?ConstantExpr,?PlusExpr,?TimesExpr,?NegExpr?
          {...}

          public?record?ConstantExpr(int?i)???????implements?Expr?{...}
          public?record?PlusExpr(Expr?a,?Expr?b)??implements?Expr?{...}
          public?record?TimesExpr(Expr?a,?Expr?b)?implements?Expr?{...}
          public?record?NegExpr(Expr?e)???????????implements?Expr?{...}

          ZGC

          ZGC(Z Garbage Collector) 這是一款在 JDK11 引入的的具有實(shí)驗(yàn)性質(zhì)的低延遲的 GC 收集器。

          這款 GC 收集器的希望在盡可能對吞吐量影響不大的前提下,實(shí)現(xiàn)在任意堆內(nèi)存大小都可以把垃圾收集器的停頓時間限制在十毫秒以內(nèi)的低延遲。

          ZGC 經(jīng)過這兩三年的迭代優(yōu)化,終于在 JDK15 中正式引入,標(biāo)志著 ZGC 可以正式應(yīng)用于生產(chǎn)應(yīng)用。

          JDK15 中默認(rèn)虛擬機(jī)還是 G1,如果需要使用 ZGC,需要在啟動參數(shù)中加入如下參數(shù):

          -XX:+UseZGC?command-line?

          最后

          本來這篇文章是準(zhǔn)備寫下 IDEA 2020.2 新版本特性,順帶介紹一下 JDK15 新特性的。

          可是沒想到寫著寫著,JDK15 相關(guān)的篇幅就過長了,所以就單獨(dú)拿出來了。

          最后,最后,JDK 都發(fā)布到 15 了,而我卻還在用 JDK 7 ,真是個悲傷的故事,逃了逃了!


          最后

          文章有幫助可以點(diǎn)個「在看」或「分享」,都是支持,我都喜歡!

          我是Guide哥,Java后端開發(fā),半個全棧,自由的少年。一個三觀比主角還正的技術(shù)人。我們下期再見!

          2020-08-05 10:25

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久免费精品 | 91AV天天在线观看 | 内射网站在线观看在线观看 | 奇米色综合 | 国产精品豆花视频www |