日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JDK 14 / JEP 305模式匹配“ Smart Casts”实例

發(fā)布時(shí)間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK 14 / JEP 305模式匹配“ Smart Casts”实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我通常將Java代碼中instanceof運(yùn)算符的存在視為“ 紅色標(biāo)志 ”,這意味著在某些情況下使用instanceof不一定是錯(cuò)誤的,但是使用它有時(shí)表示可以以一種更干凈的方式解決設(shè)計(jì)問題,如所述本文末尾引用的一些資源中的內(nèi)容(包括有關(guān)Java以外語(yǔ)言的類似類型檢查功能的資源)。

盡管我已經(jīng)看到instanceof不需要使用多次,但我遇到了更多情況,要避免instanceof并不容易。 當(dāng)使用遺留代碼庫(kù)以及某些庫(kù)和框架時(shí),尤其如此,在這些庫(kù)和框架中,我無法重構(gòu)類之間的關(guān)系以支持接口,方法重寫以及其他可用于消除對(duì)instanceof 。

與使用的一個(gè)非常普通的技術(shù)instanceof是立即強(qiáng)制轉(zhuǎn)換為類型在有條件使用檢查instanceof 。 JEP 305 [“ instanceof(Preview)的模式匹配”]提供了這種常見模式的示例,在這里我略微修改了該示例:

if (object instanceof String) { final String string = (String) object; // Do something with the 'string' variable typed as String }

本杰·韋伯(Benji Weber )發(fā)表了關(guān)于使用反射和使用lambda表達(dá)式來實(shí)現(xiàn)類似Kotlin的 “智能轉(zhuǎn)換實(shí)例”的文章。 幸運(yùn)的是, JDK 14和JEP 305對(duì)此方法提供了內(nèi)置的語(yǔ)言支持(盡管處于預(yù)覽狀態(tài))。

JDK 14引入了預(yù)覽功能 ,該功能允許在條件內(nèi)完全實(shí)現(xiàn)條件和關(guān)聯(lián)的強(qiáng)制轉(zhuǎn)換instanceof 。 接下來顯示對(duì)以上代碼示例的影響:

if (object instanceof String string) { // Do something with the 'string' variable typed as String }

此預(yù)覽功能在JDK 14 Early Access Builds中可用,而我在本文中的示例中使用的是JDK 14 Early Access Build 34 。

在JDK 14 JEP 305預(yù)覽功能是一個(gè)小的精密,其優(yōu)點(diǎn)是在漫長(zhǎng)的更加明顯if - then - else的條件語(yǔ)句。 接下來的兩個(gè)代碼清單提供了對(duì)調(diào)用instanceof的“舊方法”和顯式轉(zhuǎn)換為使用instanceof 模式匹配的“新預(yù)覽方法”的比較。

傳統(tǒng)instanceof結(jié)合顯式cast

static void makeAnimalNoises( final Object animal) { if (animal Dog) (animal instanceof Dog) { final Dog dog = (Dog) animal; out.println(dog.bark()); } else if (animal Cat) (animal instanceof Cat) { final Cat cat = (Cat) animal; out.println(cat.meow()); } else if (animal Duck) (animal instanceof Duck) { final Duck duck = (Duck) animal; out.println(duck.quack()); } else if (animal Horse) (animal instanceof Horse) { final Horse horse = (Horse) animal; out.println(horse.neigh()); } else if (animal Cow) (animal instanceof Cow) { final Cow cow = (Cow) animal; out.println(cow.moo()); } else if (animal instanceof Lion) { final Lion lion = (Lion) animal; out.println(lion.roar()); } else { out.println( "ERROR: Unexpected animal: " + animal); } }

JDK 14 / JEP 305預(yù)覽功能

static void makeAnimalNoises( final Object animal) { if (animal Dog dog) (animal instanceof Dog dog) { out.println(dog.bark()); } else if (animal instanceof Cat cat) { out.println(cat.meow()); } else if (animal Duck duck) (animal instanceof Duck duck) { out.println(duck.quack()); } else if (animal Horse horse) (animal instanceof Horse horse) { out.println(horse.neigh()); } else if (animal Cow cow) (animal instanceof Cow cow) { out.println(cow.moo()); } else if (animal Lion lion) (animal instanceof Lion lion) { out.println(lion.roar()); } else { out.println( "ERROR: Unexpected animal: " + animal); } }

完整的代碼在GitHub上,并且可以使用舊方法和新預(yù)覽方法之間的區(qū)別 。

因?yàn)閕nstanceof模式匹配是預(yù)覽功能,所以使用此功能的代碼必須使用javac標(biāo)志--enable-preview和-source 14進(jìn)行編譯。 它必須使用java標(biāo)志--enable-preview 。

結(jié)論

有關(guān)如何實(shí)現(xiàn)此功能的更多詳細(xì)信息,請(qǐng)參見“ RFR:JDK-8237528:instanceof的模式匹配的低效率編譯 ”一文。 instanceof 模式匹配支持是Amber向Java減少樣板代碼提供的又一步。

有關(guān)使用instanceof問題的資源

  • Java'instanceOf':為什么以及如何在代碼中避免使用它
  • 您真的需要instanceof嗎?
  • 在Java中使用instanceof是否考慮了不良做法?
  • 使用Instanceof主要是代碼異味
  • 有條件的Instanceof:代碼氣味
  • 當(dāng)心操作符的instanceof
  • “ instanceof”有多邪惡?
  • 類型檢查是代碼異味

翻譯自: https://www.javacodegeeks.com/2020/02/jdk-14-jep-305-instanceof-pattern-matching-smart-casts.html

總結(jié)

以上是生活随笔為你收集整理的JDK 14 / JEP 305模式匹配“ Smart Casts”实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。