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提供的这个特性我感觉非常棒,省去了一些多余的代码,提高了代码的健壮性。期待以后还会挖掘出更多的用法。

经验分享 程序员 微信小程序 职场和发展