JDK 14 / JEP 305模式匹配“ Smart Casts”实例
我通常將Java代碼中instanceof運(yùn)算符的存在視為“ 紅色標(biāo)志 ”,這意味著在某些情況下使用instanceof不一定是錯(cuò)誤的,但是使用它有時(shí)表示可以以一種更干凈的方式解決設(shè)計(jì)問(wèn)題,如所述本文末尾引用的一些資源中的內(nèi)容(包括有關(guān)Java以外語(yǔ)言的類似類型檢查功能的資源)。
盡管我已經(jīng)看到instanceof不需要使用多次,但我遇到了更多情況,要避免instanceof并不容易。 當(dāng)使用遺留代碼庫(kù)以及某些庫(kù)和框架時(shí),尤其如此,在這些庫(kù)和框架中,我無(wú)法重構(gòu)類之間的關(guān)系以支持接口,方法重寫(xiě)以及其他可用于消除對(duì)instanceof 。
與使用的一個(gè)非常普通的技術(shù)instanceof是立即強(qiáng)制轉(zhuǎn)換為類型在有條件使用檢查instanceof 。 JEP 305 [“ instanceof(Preview)的模式匹配”]提供了這種常見(jiàn)模式的示例,在這里我略微修改了該示例:
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á)式來(lái)實(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 。 接下來(lái)顯示對(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ǔ)句。 接下來(lái)的兩個(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)參見(jiàn)“ RFR:JDK-8237528:instanceof的模式匹配的低效率編譯 ”一文。 instanceof 模式匹配支持是Amber向Java減少樣板代碼提供的又一步。
有關(guān)使用instanceof問(wèn)題的資源
- 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èn)題。
- 上一篇: ejb生命周期_EJB 3.x:生命周期
- 下一篇: 浓硫酸的密度 浓硫酸的密度是什么