日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

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

與使用的一個非常普通的技術(shù)instanceof是立即強制轉(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表達式來實現(xiàn)類似Kotlin的 “智能轉(zhuǎn)換實例”的文章。 幸運的是, JDK 14和JEP 305對此方法提供了內(nèi)置的語言支持(盡管處于預(yù)覽狀態(tài))。

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

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ù)覽功能是一個小的精密,其優(yōu)點是在漫長的更加明顯if - then - else的條件語句。 接下來的兩個代碼清單提供了對調(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ū)別 。

因為instanceof模式匹配是預(yù)覽功能,所以使用此功能的代碼必須使用javac標志--enable-preview和-source 14進行編譯。 它必須使用java標志--enable-preview 。

結(jié)論

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

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

  • Java'instanceOf':為什么以及如何在代碼中避免使用它
  • 您真的需要instanceof嗎?
  • 在Java中使用instanceof是否考慮了不良做法?
  • 使用Instanceof主要是代碼異味
  • 有條件的Instanceof:代碼氣味
  • 當心操作符的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”实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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