Java 17 是一个长期支持版本 (LTS),于 2021 年发布,包含多个新特性和改进。以下是一些关键的新特性及其示例说明:
1. Pattern Matching for switch
(Preview)
Java 17 引入了对 switch
语句的模式匹配功能(作为预览功能)。通过这种方式,switch
语句可以根据对象的类型来执行匹配,从而避免传统的类型转换和显式判断。
示例:
/**
* 功能描述:
*switch 语句可以作为表达式使用,并且返回一个值。
* @author Songxianyang
* @date 2024-10-15 11:04
*/
public class SwitchExpression {
public static void main(String[] args) {
int i=2;
String name= switch (i) {
case 1 -> "my-1";
case 2 -> "my-2";
case 3 -> "my-3";
default -> "my";
};
System.out.println(name);
}
}
2. Sealed Classes
密封类允许类或接口明确控制哪些其他类可以扩展它。它有助于设计更稳定和安全的类层次结构。
示例:
/**
* 功能描述:密封类
* 家禽
* 语法:
* public abstract sealed class 父类
* permits 指定的子类 ,Duck
* Poultry家禽
* Chicken ,Duck 鸡鸭
* @author Songxianyang
* @date 2024-10-15 10:35
*/
public abstract sealed class Poultry permits Chicken ,Duck {
abstract void eat();
}
/**
* 功能描述:
* 鸭
* @author Songxianyang
* @date 2024-10-15 10:39
*/
public final class Duck extends Poultry{
@Override
void eat() {
System.out.println("小鸭吃");
}
}
/**
* 功能描述:
* 鸡
* @author Songxianyang
* @date 2024-10-15 10:38
*/
public final class Chicken extends Poultry{
@Override
void eat() {
System.out.println("小鸡吃");
}
}
在这个示例中,Shape
是一个密封类,只允许 Chicken和 Duck 扩展它,限制了继承范围,增强了代码的安全性。
然而 Goose (鹅) 就提示 继承范围
3. Records Enhancements
Java 17 对 Record
进一步增强,允许在记录类中定义嵌套记录类,并改进了序列化的处理。
示例:
/**
* 记录类是不可变数据类的简洁表示方式,适用于仅包含字段、构造函数、equals、hashCode 和 toString 方法的类
*/
public record UserRecord(String name,String sex) {
}
public class Test {
public static void main(String[] args) {
UserRecord userRecord = new UserRecord("song", "nan");
System.out.println(userRecord.sex());
System.out.println(userRecord.name());
}
}
4. Foreign Function and Memory API (Incubator)
Java 17 引入了外部函数和内存访问 API (作为孵化器项目),允许 Java 程序更安全、有效地与非 Java 代码和内存进行交互。这提供了一种与本地代码(例如 C 库)交互的机制。
示例:
使用 MemorySegment
和 MemoryAddress
来管理本机内存:
import jdk.incubator.foreign.*;
public class MemoryExample {
public static void main(String[] args) {
try (var scope = ResourceScope.newConfinedScope()) {
MemorySegment segment = MemorySegment.allocateNative(100, scope);
MemoryAddress address = segment.address();
System.out.println("Allocated memory address: " + address);
}
}
}
5. Strong Encapsulation by Default in JDK Internals
Java 17 加强了对 JDK 内部 API 的封装,除非显式开启,程序无法直接访问 JDK 内部的类或方法。用户需要使用 --add-opens
参数解封特定的模块或包。
示例:
--add-opens java.base/java.lang=ALL-UNNAMED
6. Deprecating the Applet API for Removal
Java 17 标记了 Applet
API 为废弃,未来版本将完全移除。尽管 Applet
在早期被用于 Web 浏览器中的嵌入式应用程序,但它已过时并且不再使用。
7. New macOS Rendering Pipeline
Java 17 在 macOS 上引入了一个全新的渲染管道,使用 Apple 的 Metal API 取代了以前的 OpenGL。这提高了 macOS 上 GUI 应用的性能和可扩展性。
8. Enhanced Pseudorandom Number Generators (JEP 356)
Java 17 改进了伪随机数生成器 API,增加了更多种类的随机数生成算法,并使其更加灵活和易于使用。
示例:
/**
* 功能描述:
* RandomGeneratorFactory 可以创建各种随机数生成器。
* @author Songxianyang
* @date 2024-10-15 11:08
*/
public class RandomGeneratorMain {
public static void main(String[] args) {
RandomGeneratorFactory.all().forEach(ss-> System.out.println(ss.name()));
System.out.println("-------------------");
RandomGenerator gen = RandomGeneratorFactory.of("Xoshiro256PlusPlus").create();
System.out.println(gen.nextInt(50));// 输出 0 到 50 之间的随机数
}
}
9. Text Blocks Enhancements
虽然 Text Blocks
是 Java 13 引入的,但在 Java 17 中对其做了更多的改进,支持更好的格式化功能,减少了与传统字符串的编码问题。
示例:
/**
* 功能描述:
* 文本块 """ 提供了一个方便的方式定义多行字符串
* 而无需每行添加 + 或 \n
* @author Songxianyang
* @date 2024-10-15 10:55
*/
public class StringText {
public static void main(String[] args) {
String json= """
{
"id": "1840575190483111937",
"name":"Java17"
}
""";
System.out.println(json);
}
}
10. Pattern Matching for ****instanceof**
instanceof 语句得到了增强,不再需要显式进行类型转换。
示例:
/**
* 功能描述:
*instanceof 语句得到了增强,不再需要显式进行类型转换。
* @author Songxianyang
* @date 2024-10-15 10:44
*/
public class InstanceofMain {
public static void main(String[] args) {
Object obj = "song";
if (obj instanceof String) {
System.out.println("String-toUpperCase"+((String) obj).toUpperCase());
}
}
}
总结:
Java 17 在类型匹配、类结构控制、性能改进和安全性上都做了重大改进,尤其是引入了模式匹配、密封类、增强的随机数生成器 API,以及对本地代码的更好支持,使得代码开发更加高效、安全和简洁。