java14新特性

java 14 新增了很多特性,我们针对较为突出的特性进行说明。jdk12和jdk13中预览版的switch特性,在jdk14中已经是正式的语法了。

instanceof模式匹配

该特性可以减少强制类型转换的操作,代码示例:

public class TestInstanceof{
    public static void main(String[] args){

        //jdk14之前的写法
        Object obj = new Integer(1);
        if(obj instanceof Integer){
            Integer i = (Integer)obj;
            int result = i + 10;
            System.out.println(i);
        }

        //jdk14新特性  不用再强制转换了
        //这里相当于是将obj强制为Integer之后赋值给i了
        if(obj instanceof Integer i){
            int result = i + 10;
            System.out.println(i);
        }else{
            //作用域问题,这里是无法访问i的
        }
    }
}

这个是预览版的功能所以需要使用下面命令编译和运行

编译:
    javac --enable-preview -source 14 TestInstanceof.java

运行:
    java --enable-preview TestInstanceof

友好的空指针(NullPointerException)提示

jdk14中添加了对于空指针异常友好的提示,便于开发者快速定位空指针的对象。示例代码:

class Machine{
    public void start(){
        System.out.println("启动");
    }
}

class Engine{
    public Machine machine;
}

class Car{
    public Engine engine;

}

public class TestNull{
    public static void main(String[] args){
        //这里会报出空指针,但是哪个对象是null呢?
        new Car().engine.machine.start();
    }
}

上面代码如果要定位是哪个对象为null导致的问题,需要使用debug或者打印对象的方式定位。此时我们可以使用一个参数,让jdk给出明确的提示

java -XX:+ShowCodeDetailsInExceptionMessages TestNull

这样编译器会明确的告诉开发者哪个对象是null。

record类型

之前在编写javabean类的时候,需要编写成员变量,get方法,构造方法,toString方法,hashcode方法,equals方法。这些方法通常会通过开发工具来生成,在jdk14中新增了record类型,通过该类型可以省去这些代码的编写。

jdk14编写User

public record User(String name,Integer age){}

通过反编译命令可以看到该字节码文件中的内容,User类是继承了Record类型:

javap -p -private user

编写测试类:

public class TestUser{
    public static void main(String[] args){
        User u = new User("jack",15);
        System.out.println(u);
        System.out.println(u.name());
    }
}

这个是预览版的功能所以需要使用下面命令编译和运行

编译:
    javac --enable-preview -source 14 TestUser.java

运行:
    java --enable-preview TestUser

记录类型有自动生成的成员,包括:

  • 状态描述中的每个组件都有对应的private final字段。
  • 状态描述中的每个组件都有对应的public访问方法。方法的名称与组件名称相同。
  • 一个包含全部组件的公开构造器,用来初始化对应组件。
  • 实现了equals()和hashCode()方法。equals()要求全部组件都必须相等。
  • 实现了toString(),输出全部组件的信息。