jdk安装教程
我通常将Java代码中instanceof运算符的存在视为“红色标志”,这意味着在某些情况下使用instanceof
不一定是错误的,但是使用它有时表示可以以更简洁的方式解决设计问题,如所述本文结尾处引用的一些资源中的内容(包括有关Java以外语言的类似类型检查功能的资源)。
尽管我已经看到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 )发布了有关使用反射和使用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 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 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安装教程