mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[feat] Java14新特性重构
This commit is contained in:
parent
e7e8d481d2
commit
801c2200fc
@ -513,7 +513,7 @@ Java12 为默认的垃圾收集器 G1 带来了两项更新:
|
||||
|
||||
传统的 `switch` 语法存在容易漏写 `break` 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复
|
||||
|
||||
Java12 提供了 `swtich` 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break 。
|
||||
Java12 增强了 `swtich` 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break 。
|
||||
|
||||
```java
|
||||
switch (day) {
|
||||
@ -553,9 +553,9 @@ if(obj instanceof String str){
|
||||
|
||||
#### 文本块
|
||||
|
||||
解决 Java 定义多行字符串时只能通过换行转义或者换行连接符来变通支持的问题,引入**三重双引号**来定义多行文本
|
||||
解决 Java 定义多行字符串时只能通过换行转义或者换行连接符来变通支持的问题,引入**三重双引号**来定义多行文本。
|
||||
|
||||
两个`"""`中间的任何内容都会被解释为字符串的一部分,包括换行符。
|
||||
Java 13 支持两个 `"""` 符号中间的任何内容都会被解释为字符串的一部分,包括换行符。
|
||||
|
||||
未支持文本块之前的 HTML 写法:
|
||||
|
||||
@ -600,7 +600,7 @@ String query = """
|
||||
|
||||
- `formatted(Object... args)` :它类似于 `String` 的`format()`方法。添加它是为了支持文本块的格式设置。
|
||||
- `stripIndent()` :用于去除文本块中每一行开头和结尾的空格。
|
||||
- `translateEscapes()` :转义序列如 *“\\\t”* 转换为 *“\t”*
|
||||
- `translateEscapes()` :转义序列如 _“\\\t”_ 转换为 _“\t”_
|
||||
|
||||
由于文本块是一项预览功能,可以在未来版本中删除,因此这些新方法被标记为弃用。
|
||||
|
||||
@ -617,7 +617,7 @@ public String translateEscapes() {
|
||||
}
|
||||
```
|
||||
|
||||
#### Switch(引入 yield 关键字到 Switch 中)
|
||||
#### 增强 Switch(引入 yield 关键字到 Switch 中)
|
||||
|
||||
`Switch` 表达式中就多了一个关键字用于跳出 `Switch` 块的关键字 `yield`,主要用于返回一个值
|
||||
|
||||
@ -645,7 +645,7 @@ ZGC 堆由一组称为 ZPages 的堆区域组成。在 GC 周期中清空 ZPages
|
||||
|
||||
Java Socket API 终于迎来了重大更新!
|
||||
|
||||
Java 13 将 Socket API 的底层进行了重写, `NioSocketImpl` 是对 ``PlainSocketImpl`` 的直接替代,它使用 `java.util.concurrent` 包下的锁而不是同步方法。如果要使用旧实现,请使用 `-Djdk.net.usePlainSocketImpl=true`。
|
||||
Java 13 将 Socket API 的底层进行了重写, `NioSocketImpl` 是对 `PlainSocketImpl` 的直接替代,它使用 `java.util.concurrent` 包下的锁而不是同步方法。如果要使用旧实现,请使用 `-Djdk.net.usePlainSocketImpl=true`。
|
||||
|
||||
并且,在 Java 13 中是默认使用新的 Socket 实现,使其易于发现并在排除问题同时增加可维护性
|
||||
|
||||
@ -675,13 +675,58 @@ $ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
|
||||
|
||||
## Java14
|
||||
|
||||
### record 关键字
|
||||
### 空指针异常精准提示
|
||||
|
||||
- 简化数据类的定义方式,使用 record 代替 class 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 toString,hashCode,equals 方法
|
||||
通过 JVM 参数中添加`-XX:+ShowCodeDetailsInExceptionMessages`,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
|
||||
|
||||
- 类似于使用 Class 定义类,同时使用了 lomobok 插件,并打上了`@Getter,@ToString,@EqualsAndHashCode`注解
|
||||
```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` 代替 `class` 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 `toString()`,`hashCode()`, `equals()`方法
|
||||
|
||||
类似于使用 `class` 定义类,同时使用了 lomobok 插件,并打上了`@Getter,@ToString,@EqualsAndHashCode`注解
|
||||
|
||||
```java
|
||||
/**
|
||||
@ -710,85 +755,63 @@ $ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
|
||||
record Rectangle(float length, float width) { }
|
||||
```
|
||||
|
||||
### 空指针异常精准提示
|
||||
#### 文本块
|
||||
|
||||
- 通过 JVM 参数中添加`-XX:+ShowCodeDetailsInExceptionMessages`,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题
|
||||
Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:
|
||||
|
||||
- `\` : 表示行尾,不引入换行符
|
||||
- `\s` :表示单个空格
|
||||
|
||||
```java
|
||||
a.b.c.i = 99; // 假设这段代码会发生空指针
|
||||
String str = "凡心所向,素履所往,生如逆旅,一苇以航。";
|
||||
|
||||
String str2 = """
|
||||
凡心所向,素履所往, \
|
||||
生如逆旅,一苇以航。""";
|
||||
System.out.println(str2);// 凡心所向,素履所往, 生如逆旅,一苇以航。
|
||||
String text = """
|
||||
java
|
||||
c++\sphp
|
||||
""";
|
||||
System.out.println(text);
|
||||
//输出:
|
||||
java
|
||||
c++ php
|
||||
```
|
||||
|
||||
```java
|
||||
Exception in thread "main" java.lang.NullPointerException:
|
||||
Cannot read field 'c' because 'a.b' is null.
|
||||
at Prog.main(Prog.java:5) // 增加参数后提示的异常中很明确的告知了哪里为空导致
|
||||
```
|
||||
|
||||
### switch 的增强终于转正
|
||||
|
||||
- JDK12 引入的 switch(预览特性)在 JDK14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用
|
||||
- 主要是用`->`来替代以前的`:`+`break`;另外就是提供了 yield 来在 block 中返回值
|
||||
|
||||
_Before Java 14_
|
||||
|
||||
```java
|
||||
switch (day) {
|
||||
case MONDAY:
|
||||
case FRIDAY:
|
||||
case SUNDAY:
|
||||
System.out.println(6);
|
||||
break;
|
||||
case TUESDAY:
|
||||
System.out.println(7);
|
||||
break;
|
||||
case THURSDAY:
|
||||
case SATURDAY:
|
||||
System.out.println(8);
|
||||
break;
|
||||
case WEDNESDAY:
|
||||
System.out.println(9);
|
||||
break;
|
||||
}
|
||||
```
|
||||
|
||||
_Java 14 enhancements_
|
||||
|
||||
```java
|
||||
switch (day) {
|
||||
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
|
||||
case TUESDAY -> System.out.println(7);
|
||||
case THURSDAY, SATURDAY -> System.out.println(8);
|
||||
case WEDNESDAY -> System.out.println(9);
|
||||
}
|
||||
```
|
||||
|
||||
### instanceof 增强
|
||||
#### instanceof 增强
|
||||
|
||||
依然是**预览特性** ,Java 12 新特性中介绍过。
|
||||
|
||||
### 其他特性
|
||||
### Java14 其他特性
|
||||
|
||||
- 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
|
||||
- 移除了 CMS 垃圾收集器(功成而退)
|
||||
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
|
||||
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的`deb`和`rpm`,window 平台下的`msi`和`exe`
|
||||
|
||||
## 总结
|
||||
|
||||
### 关于预览特性
|
||||
|
||||
- 先贴一段 oracle 官网原文:`This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options.`
|
||||
- 这是一个预览功能,该功能的设计,规格和实现是完整的,但不是永久性的,这意味着该功能可能以其他形式存在或在将来的 JDK 版本中根本不存在。 要编译和运行包含预览功能的代码,必须指定其他命令行选项。
|
||||
- 就以`switch`的增强为例子,从 Java12 中推出,到 Java13 中将继续增强,直到 Java14 才正式转正进入 JDK 可以放心使用,不用考虑后续 JDK 版本对其的改动或修改
|
||||
- 一方面可以看出 JDK 作为标准平台在增加新特性的严谨态度,另一方面个人认为是对于预览特性应该采取审慎使用的态度。特性的设计和实现容易,但是其实际价值依然需要在使用中去验证
|
||||
先贴一段 oracle 官网原文:`This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options.`
|
||||
|
||||
这是一个预览功能,该功能的设计,规格和实现是完整的,但不是永久性的,这意味着该功能可能以其他形式存在或在将来的 JDK 版本中根本不存在。 要编译和运行包含预览功能的代码,必须指定其他命令行选项。
|
||||
|
||||
就以`switch`的增强为例子,从 Java12 中推出,到 Java13 中将继续增强,直到 Java14 才正式转正进入 JDK 可以放心使用,不用考虑后续 JDK 版本对其的改动或修改
|
||||
|
||||
一方面可以看出 JDK 作为标准平台在增加新特性的严谨态度,另一方面个人认为是对于预览特性应该采取审慎使用的态度。特性的设计和实现容易,但是其实际价值依然需要在使用中去验证
|
||||
|
||||
### JVM 虚拟机优化
|
||||
|
||||
- 每次 Java 版本的发布都伴随着对 JVM 虚拟机的优化,包括对现有垃圾回收算法的改进,引入新的垃圾回收算法,移除老旧的不再适用于今天的垃圾回收算法等
|
||||
- 整体优化的方向是**高效,低时延的垃圾回收表现**
|
||||
- 对于日常的应用开发者可能比较关注新的语法特性,但是从一个公司角度来说,在考虑是否升级 Java 平台时更加考虑的是**JVM 运行时的提升**
|
||||
每次 Java 版本的发布都伴随着对 JVM 虚拟机的优化,包括对现有垃圾回收算法的改进,引入新的垃圾回收算法,移除老旧的不再适用于今天的垃圾回收算法等
|
||||
|
||||
## 参考信息
|
||||
整体优化的方向是**高效,低时延的垃圾回收表现**
|
||||
|
||||
对于日常的应用开发者可能比较关注新的语法特性,但是从一个公司角度来说,在考虑是否升级 Java 平台时更加考虑的是**JVM 运行时的提升**
|
||||
|
||||
## 参考资料
|
||||
|
||||
- JDK Project Overview : <https://openjdk.java.net/projects/jdk/ >
|
||||
- IBM Developer Java9 <https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-9/>
|
||||
- Guide to Java10 <https://www.baeldung.com/java-10-overview>
|
||||
- Java 10 新特性介绍<https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-10/index.html>
|
||||
@ -801,3 +824,4 @@ switch (day) {
|
||||
- Java13 新特性概述 <https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-13/index.html>
|
||||
- Oracle Java14 record <https://docs.oracle.com/en/java/javase/14/language/records.html>
|
||||
- java14-features <https://www.techgeeknext.com/java/java14-features>
|
||||
- Java 14 Features : <https://www.journaldev.com/37273/java-14-features>
|
Loading…
x
Reference in New Issue
Block a user