Appearance
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 {
}