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

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

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

与使用的一个非常普通的技术instanceof是立即强制转换为类型在有条件使用检查instanceofJEP 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 14JEP 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问题的资源

翻译自: https://www.javacodegeeks.com/2020/02/jdk-14-jep-305-instanceof-pattern-matching-smart-casts.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值