内容介绍:
-
Record -- 简化了简单 Java 类的创建。 -
Pattern Matching -- 简化了 instanceof 。 -
Switch 表达式 -- 简化了 switch 语句。 -
NullPointerException -- 提供了精准的 NULL 信息。
1. Record
比如说你要创建一个 Student 类,包括属性 id、name,都需要做什么?大概步骤如下:
-
创建一个 Student Class -
定义所需的属性 -
定义构造方法 -
getter()/setter() -
覆写 toString() -
覆写 equals() -
覆写 hashCode()
示例代码:
public class Student{
private int id;
private String name;
public Student(){
...
}
public int getId(){
...
}
// ... 其他 getter()/setter()
public boolean equals(Student s) {
...
}
public int hashCode() {
...
}
public String toString() {
...
}
}
这是不是很麻烦,就是定义一个非常简单的类,却需要做这么多事儿。
有了 Record 之后就简单了:
record Student(int id, int name) { }
只需要一行代码,上述那些冗长的代码会由 Java 帮我们自动生成。
Record 定义的是一个 final class,不可变,其中的属性也一样,所以不会有 setter 方法。
getter 也并不需要使用 getXXX
,直接使用属性名即可。
2. Pattern Matching
先看传统的 instanceof 用法:
public void attendTo(Animal a) {
if (a instanceof Dog) {
walk((Dog)a);
} else if (a instanceof Cat) {
cleanLitterBoxOf((Cat)a);
} else {
returnToStore(a);
}
}
再看新用法:
public void attendTo(Animal a) {
if (a instanceof Dog d) {
walkDog(d);
} else if (a instanceof Cat a) {
cleanLitterBoxOf(a);
} else {
returnToStore(a);
}
}
看到区别了吧,在检查类型的同时,可以定义一个变量,下面就可以直接使用了,不用再手动转型了。
3. Switch 表达式
之前 Switch 是一个流程控制语句,而在 Java 14 中,Switch 还可以作为一个表达式来使用。
传统用法:
int i = -1;
String s = ...;
switch (s) {
case "none":
i = 0;
break;
case "one":
i = 1;
break;
default:
i = 2;
}
新用法:
int i = ...
String s = switch (i) {
case 0 -> "none";
case 1 -> "one";
default -> "many;
}
再举个例子:
int days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
days = 30;
break;
case 2:
days = 28;
break;
default:
throw new IllegalArgumentException("Invalid month");
}
新用法:
int days = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9 -> 30;
case 2 -> 28;
default -> 0;
};
4. NullPointerException
NullPointerException 空指针异常是很常见的,但是其异常信息并不明确。
例如下面的代码:
String emailAddress = employee
.getPersonalDetails()
.getEmailAddress()
.toLowerCase();
如果出现了空指针,异常信息是这样的:
Exception in thread "main" java.lang.NullPointerException
at xxx.HelpfulNullPointerException.main(xxx.java:10)
(代码框显示不全,可以横向滑动)
异常信息中只告诉你这一行代码出现了空指针,但是,到底是 getPersonalDetails()
还是 getEmailAddress()
呢?只能自己分析了。
Java 14 对 NullPointerException 进行了优化,异常信息会是这样的:
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "String.toLowerCase()" because the return value of
"xxx.HelpfulNullPointerException$PersonalDetails.getEmailAddress()" is null
at xxx.HelpfulNullPointerException.main(xxx.java:10)
(代码框显示不全,可以横向滑动)
从中可以明确知道是 getEmailAddress()
为空,这样就方便多了。
Happy Learning … :-)
参考资料:
https://levelup.gitconnected.com/the-real-potential-in-java-14s-records-dd42a24dc739
https://www.baeldung.com/java-14-nullpointerexception
https://www.codejava.net/java-core/the-java-language/switch-expression-examples
注意:本文归作者所有,未经作者允许,不得转载