继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java 14 instanceof 的模式匹配

明明如月
关注TA
已关注
手记 59
粉丝 3858
获赞 1465

1. 概述

本文是 Java 14 系列教程的其中一篇,本文主要讲述 InstanceOf 的模式匹配。

JEP 305 的核心目的是让创建对象更简单、简洁、可读性更强而且更加安全。

2. 传统的 instanceOf 操作

很多时候,我们需要检查对象的类型,然后根据类型去编写不同的逻辑。通常会使用 instanceof 进行判断,然后再对对象进行强制类型转换。

if (animal instanceof Cat) {
    Cat cat = (Cat) animal;
    cat.meow();
   // other cat operations
} else if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.woof();
    // other dog operations
}
 
// More conditional statements for different animals

在上述代码示例中,我们每种情况要通过 instanceof 判断 animal 的具体类型,然后强制类型转换声明为局部变量。然后根据具体的类型执行特定的函数。

这有很多缺点:

  • 这么写非常单调乏味,需要检测类型然后强制类型转换。
  • 每个if 都要出现三次类型名。
  • 类型转换和变量声明可读性很差
  • 重复声明类型名意味着很容易出错。可能导致未预料到的运行时错误。
  • 每新增一个animal 类型就要修改这里的函数。

下面将介绍 Java 14 提供的改进特性。

3. Java 14 改进版的 instanceOf

Java 14 带来了新版的 instanceof 操作,将参数类型检查和绑局部变量类型合并到了一起。

if (animal instanceof Cat cat) {
    cat.meow();
} else if(animal instanceof Dog dog) {
    dog.woof();
}

首先在 if 代码块对 animal 的类型和 Cat 进行匹配。 先看 animal 变量是否为 Cat 类型的实例,如果是,强转为 Cat 类型,并赋值给 cat。

注意变量名 cat 并不是一个存在的变量,而是模式变量的声明。

变量 cat 和 dog 只有当模式匹配表达式的结果为 true 时才生效和赋值。如果你把变量在别的地方用,会出现编译错误。

正如上面讲到的, Java 14 版本的代码更易懂。通过这种方式可以减少大量的类型转换,可读性大大提高。

此外,这种类型的测试模式,在编写 equality (equals)函数时非常有用。

4. 结论

本篇简短的文章讲述了 Java 14 instanceof 进行模式匹配。使用 Java 内置语言特性帮助我们编写质量更高,可读性更强的代码。

一如既往,我们的完整代码可以在 GitHub 上获取到。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP