Skip to content

JDK10之本地变量类型推断

在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量。

java
var value = new MyObject();

其实本地变量类型推断,也是Java10提供给开发者的语法糖。虽然我们在代码中使用var进行了定义,但是对于虚拟机来说他是不认识这个var的,在java文件编译成class文件的过程中,会进行解糖,使用变量真正的类型来替代var。

JDK12之Switch表达式

在JDK 12中引入了Switch表达式作为预览特性。并在Java 13中修改了这个特性,引入了yield语句,用于返回值。而在之后的Java 14中,这一功能正式作为标准功能提供出来。在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:

java
int i;
switch (x) {
    case "1":
        i=1;
        break;
    case "2":
        i=2;
        break;
    default:
        i = x.length();
        break;
}

jdk13之后可以变成如下写法:

java
int i = switch (x) {
    case "1" -> 1;
    case "2" -> 2;
    default -> {
        int len = args[1].length();
        yield len;
    }
};

JDK13之TextBlocks

以前定义字符串进行换行时需要\n转换,jdk13之后支持这样定义字符串:

java
String query = """
    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
    WHERE `CITY` = 'INDIANAPOLIS'
    ORDER BY `EMP_ID`, `LAST_NAME`;
""";

JDK14之Records

java
public class Person {
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是“字段,只是字段,除了字段什么都没有”的类。

java
record Person (String firstName, String lastName) {}

JDK14之instanceof模式匹配进阶用法

对于使用instanceof的地方会出现大量这样的写法,将至转换变量类型,然后使用

java
if (animal instanceof Cat) {
    Cat cat = (Cat) animal;
    cat.miaow();
} else if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();
}

jdk14提供了更为简单的写法,相当于直接在转换时定义,不需要额外强制转换的代码,可读性也增加了。

java
if (animal instanceof Cat cat) {
    cat.miaow();
} else if(animal instanceof Dog dog) {
    dog.bark();
}

JDK15之封闭类

假设一个业务领域只适用于汽车和卡车,而不适用于摩托车。在Java中创建Vehicle抽象类时,应该只允许Car和Truck类扩展它。

java
public sealed interface Service permits Car, Truck {
}