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 上获取到。