mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
121 lines
3.8 KiB
Markdown
121 lines
3.8 KiB
Markdown
---
|
||
title: Java 14 新特性概览
|
||
category: Java
|
||
tag:
|
||
- Java新特性
|
||
---
|
||
|
||
## 空指针异常精准提示
|
||
|
||
通过 JVM 参数中添加`-XX:+ShowCodeDetailsInExceptionMessages`,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
|
||
|
||
```java
|
||
a.b.c.i = 99; // 假设这段代码会发生空指针
|
||
```
|
||
|
||
Java 14 之前:
|
||
|
||
```java
|
||
Exception in thread "main" java.lang.NullPointerException
|
||
at NullPointerExample.main(NullPointerExample.java:5)
|
||
```
|
||
|
||
Java 14 之后:
|
||
|
||
```java
|
||
// 增加参数后提示的异常中很明确的告知了哪里为空导致
|
||
Exception in thread "main" java.lang.NullPointerException:
|
||
Cannot read field 'c' because 'a.b' is null.
|
||
at Prog.main(Prog.java:5)
|
||
```
|
||
|
||
## switch 的增强(转正)
|
||
|
||
Java12 引入的 switch(预览特性)在 Java14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用。
|
||
|
||
Java12 为 switch 表达式引入了类似 lambda 语法条件匹配成功后的执行块,不需要多写 break ,Java13 提供了 `yield` 来在 block 中返回值。
|
||
|
||
```java
|
||
String result = switch (day) {
|
||
case "M", "W", "F" -> "MWF";
|
||
case "T", "TH", "S" -> "TTS";
|
||
default -> {
|
||
if(day.isEmpty())
|
||
yield "Please insert a valid day.";
|
||
else
|
||
yield "Looks like a Sunday.";
|
||
}
|
||
|
||
};
|
||
System.out.println(result);
|
||
```
|
||
|
||
## 预览新特性
|
||
|
||
### record 关键字
|
||
|
||
`record` 关键字可以简化 **数据类**(一个 Java 类一旦实例化就不能再修改)的定义方式,使用 `record` 代替 `class` 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 `toString()`,`hashCode()`, `equals()`方法
|
||
|
||
类似于使用 `class` 定义类,同时使用了 lombok 插件,并打上了`@Getter,@ToString,@EqualsAndHashCode`注解
|
||
|
||
```java
|
||
/**
|
||
* 这个类具有两个特征
|
||
* 1. 所有成员属性都是final
|
||
* 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
|
||
* 那么这种类就很适合使用record来声明
|
||
*/
|
||
final class Rectangle implements Shape {
|
||
final double length;
|
||
final double width;
|
||
|
||
public Rectangle(double length, double width) {
|
||
this.length = length;
|
||
this.width = width;
|
||
}
|
||
|
||
double length() { return length; }
|
||
double width() { return width; }
|
||
}
|
||
/**
|
||
* 1. 使用record声明的类会自动拥有上面类中的三个方法
|
||
* 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
|
||
* 3. toString方法中包括所有成员属性的字符串表示形式及其名称
|
||
*/
|
||
record Rectangle(float length, float width) { }
|
||
```
|
||
|
||
### 文本块
|
||
|
||
Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:
|
||
|
||
- `\` : 表示行尾,不引入换行符
|
||
- `\s` :表示单个空格
|
||
|
||
```java
|
||
String str = "凡心所向,素履所往,生如逆旅,一苇以航。";
|
||
|
||
String str2 = """
|
||
凡心所向,素履所往, \
|
||
生如逆旅,一苇以航。""";
|
||
System.out.println(str2);// 凡心所向,素履所往, 生如逆旅,一苇以航。
|
||
String text = """
|
||
java
|
||
c++\sphp
|
||
""";
|
||
System.out.println(text);
|
||
//输出:
|
||
java
|
||
c++ php
|
||
```
|
||
|
||
### instanceof 增强
|
||
|
||
依然是**预览特性** ,Java 12 新特性中介绍过。
|
||
|
||
## Java14 其他特性
|
||
|
||
- 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
|
||
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
|
||
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的`deb`和`rpm`,window 平台下的`msi`和`exe`
|