Java14新特性-instanceof模式匹配
Java14中对instanceof进行了升级,不仅仅是直接用来进行类型匹配,还可以直接转换成相应的实例。
在Java14之前只能这样写:
public class Java14Before {
public static void main(String[] args) {
Person person = new Person("小明", 10, "男");
printPerson(person);
}
private static void printPerson(Object obj){
if (obj instanceof Person) {
//这里需要强制转换
Person person = (Person) obj;
System.out.println(person);
}
}
}
Person{name=小明, age=10, sex=男}
在java14中就可以这样写了:
public static void main(String[] args) {
Person person = new Person("小明", 10, "男");
printPerson(person);
}
private static void printPerson(Object obj){
if (obj instanceof Person person) {
//可以在模式匹配时直接转换成实例
System.out.println(person);
} else if (obj instanceof String str) {
System.out.println(str);
}
}
Person{name=小明, age=10, sex=男}
有这样的特性以后,我们就可以在其中做一些其它事情了,比如使用操作符&&。比如:
public static void main(String[] args) {
Person person = new Person("小明", 10, "男");
printPerson(person);
printPerson("小红");
}
private static void printPerson(Object obj){
if (obj instanceof Person person && person.getAge() > 5) {
//在这里就可以直接使用&&操作符
System.out.println(person);
} else if (obj instanceof String person) {
System.out.println(person);
}
}
Person{name=小明, age=10, sex=男}
小红
但是这里不能使用操作符||,因为操作符左边的表达式为false时不会造成短路,当执行到右边的表达式时变量还没有被定义。当然如果操作符||右边没有使用到强转后的变量是没有问题的。
总结
java14提供的这个特性我感觉非常棒,省去了一些多余的代码,提高了代码的健壮性。期待以后还会挖掘出更多的用法。
