我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”,这意味着在某些情况下使用instanceof不一定是错误的,但是使用它有时表示可以以一种更干净的方式解决设计问题,如所述本文末尾引用的一些资源中的内容(包括有关Java以外语言的类似类型检查功能的资源)。

尽管我已经看到instanceof不需要使用多次,但我遇到了更多情况,要避免instanceof并不容易。 当使用遗留代码库以及某些库和框架时,尤其如此,在这些库和框架中,我无法重构类之间的关系以支持接口,方法重写以及其他可用于消除对instanceof

与使用的一个非常普通的技术instanceof是立即强制转换为类型在有条件使用检查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 )发表了关于使用反射和使用lambda表达式来实现类似Kotlin的 “智能转换实例”的文章。 幸运的是, JDK 14和JEP 305对此方法提供了内置的语言支持(尽管处于预览状态)。

JDK 14引入了预览功能 ,该功能允许在条件内完全实现条件和关联的强制转换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预览功能是一个小的精密,其优点是在漫长的更加明显if - then - else的条件语句。 接下来的两个代码清单提供了对调用instanceof的“旧方法”和显式转换为使用instanceof 模式匹配的“新预览方法”的比较。

传统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 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上,并且可以使用旧方法和新预览方法之间的区别 。

因为instanceof模式匹配是预览功能,所以使用此功能的代码必须使用javac标志--enable-preview-source 14进行编译。 它必须使用java标志--enable-preview

结论

有关如何实现此功能的更多详细信息,请参见“ RFR:JDK-8237528:instanceof的模式匹配的低效率编译 ”一文。 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

JDK 14 / JEP 305模式匹配“ Smart Casts”实例相关推荐

  1. jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例

    jep290涉及jdk版本 我通常将Java代码中instanceof运算符的存在视为" 红色标志 ",这意味着在某些情况下使用instanceof不一定是错误的,但是使用它有时表 ...

  2. JDK 14 – JEP 361从预览中切换表达式

    在我以前的文章中 ,我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息.随后,在JDK 13中提出了一些更改,例如使用yield关键字从switch块返回值并在预览中发布. 在即 ...

  3. JDK 14:记录,文本块等

    今天的Mark Reinhold帖子" 建议JEP针对JDK 14:305.343.359.366和368 "提议针对JDK 14再针对五个JEP. 该组中有一些备受期待的功能,尽 ...

  4. JDK 14的新特性:instanceof模式匹配

    JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...

  5. jep290涉及jdk版本_针对JDK 14提议的另外六个JEP

    jep290涉及jdk版本 Mark Reinhold最近的消息宣布了六个新的"建议针对JDK 14的JEP ": JEP 345 , JEP 361 , JEP 363 , JE ...

  6. 针对JDK 14提议的另外六个JEP

    Mark Reinhold最近的消息宣布了六个新的"建议针对JDK 14的JEP ": JEP 345 , JEP 361 , JEP 363 , JEP 364 , JEP 36 ...

  7. jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式

    jep290涉及jdk版本 在我的前一篇文章中 ,我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息.随后,在JDK 13中提出了一些更改,例如使用yield关键字从switch ...

  8. Java 14:JDK 14进入GA时的所有新功能

    是的,六个月过去了这么快,现在到了,Java 14的发布即将到来. 我们一直在跟踪新JDK在过去半年中的进展,您可以在此处找到摘要的所有功能. 但是,如果您想直接进入,可以在此处找到JDK 14二进制 ...

  9. JDK 14如期发布,16个新特性快速预览

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

最新文章

  1. 火焰图(Flame Graphs)的安装和基本用法
  2. 前谷歌工程师:如何看待程序员普遍缺乏数据结构和算法知识?
  3. LeetCode 382. 链表随机节点(概率)
  4. C++|Java混合实验-java搭建post方法靶场,Qt发送请求获取数据
  5. 几点减几点怎么列算式_洁净室平面设计怎么做?洁净室施工做到这几点就对了...
  6. python斐波那契数列函数,python—函数进阶-斐波那契数列
  7. 【oracle】除数为0
  8. eclipse项目build时,提示错误.
  9. Java学习之Servlet-doGet()与doPost()
  10. 人人都能成为安全防范的高手 ——《黑客新型攻击防范:深入剖析犯罪软件》...
  11. 注意力稀缺的时代,写作软件如何选择?
  12. SM3国密加密算法(C语言)
  13. Magick.NET图片处理:解决png转jpg背景色为黑色的问题(设置背景色)
  14. UG NX 12 创建有界平面
  15. 倒计时1天 | 大势智慧2022新品发布会全面而来!
  16. 微信公众平台教程--素材编辑
  17. 【爬虫基础】Python爬虫
  18. rundll32.exe和regsvr32.exe
  19. 算法学习——双指针,BFS,图论
  20. 【愚公系列】2022年04月 现代密码学-MD5

热门文章

  1. nssl1270-创世纪【树形dp,基环树】
  2. 【单调队列】【DP】城市交通(jzoj 1749)
  3. 操作系统复习笔记 06 CPU Scheduling CPU调度
  4. 15、sql编程基本语法介绍
  5. 键值存储之外,Redis还有这些用法
  6. Java压缩技术(三) ZIP解压缩——Java原生实现
  7. JAVA面试常考系列五
  8. Druid-目前最好的连接池
  9. JavaScript常用单词整理总结
  10. Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)