jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例
jep290涉及jdk版本
我通常將Java代碼中instanceof運算符的存在視為“ 紅色標志 ”,這意味著在某些情況下使用instanceof不一定是錯誤的,但是使用它有時表示可以通過更干凈的方式解決設計問題,如所述本文結尾處引用的一些資源中的內容(包括有關Java以外語言的類似類型檢查功能的資源)。
盡管我已經(jīng)看到instanceof不需要使用多次,但我遇到了更多情況,要避免instanceof并不容易。 當使用遺留代碼庫以及某些庫和框架時,尤其如此,在這些庫和框架中,我無法重構類之間的關系以支持接口,方法重寫以及可用于消除對instanceof需求的其他策略。
與使用的一個非常普通的技術instanceof是立即強制轉換為類型在有條件使用檢查instanceof 。 JEP 305 [“針對instanceof(預覽)的模式匹配”]提供了這種常見模式的示例,在這里我略微修改了該示例:
if (object instanceof String) { final String string = (String) object; // Do something with the 'string' variable typed as String }本杰·韋伯(Benji Weber )發(fā)布了有關使用反射和使用lambda表達式來實現(xiàn)類似Kotlin的 “智能轉換實例”的文章。 幸運的是, JDK 14和JEP 305為這種方法帶來了內置的語言支持(盡管處于預覽狀態(tài))。
JDK 14引入了預覽功能 ,該功能允許在條件內完全實現(xiàn)條件和instanceof 。 接下來顯示對以上代碼示例的影響:
if (object instanceof String string) { // Do something with the 'string' variable typed as String }此預覽功能在JDK 14 Early Access Builds中可用,而我在本文中的示例中使用的是JDK 14 Early Access Build 34 。
JDK 14中的JEP 305預覽功能是一個很小的優(yōu)點, if - then - else條件語句, then其優(yōu)勢在冗長的時間中更加明顯。 接下來的兩個代碼清單提供了對調用instanceof的“舊方法”和顯式轉換為使用instanceof 模式匹配的“新預覽方法”的比較。
傳統(tǒng)instanceof結合顯式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預覽功能
static void makeAnimalNoises( final Object animal) { if (animal Dog dog) (animal instanceof Dog dog) { out.println(dog.bark()); } else if (animal Cat cat) (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上,并且可以使用舊方法和新預覽方法之間的區(qū)別 。
由于instanceof模式匹配是預覽功能,因此使用此功能的代碼必須使用javac標志--enable-preview和-source 14進行編譯。 它必須使用java標志--enable-preview 。
結論
有關如何實現(xiàn)此功能的更多詳細信息,請參閱“ RFR:JDK-8237528:instanceof的Pattern Matching效率低下的編譯 ”一文。 instanceof 模式匹配支持是Amber向Java減少樣板代碼提供的又一步。
有關使用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
jep290涉及jdk版本
總結
以上是生活随笔為你收集整理的jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 英睿达发布新款 X9 移动 SSD:QL
- 下一篇: 苍翠的近义词 苍翠的近义词是什么
