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(),输出全部组件的信息。