随着 Java 的不断发展,每个新版本都旨在引入能够提升语言性能、可用性和灵活性的特性。
在本文中,我将为你介绍 Java 23 中的一些需要关注的重大变化,重点关注最显著的 JDK 增强提案(JEP)。。
Primitive类型在模式匹配、instanceof
和 switch
中的使用
Primitive 类型一直是 Java 的重要组成部分,但在模式匹配、instanceof
和 switch
构造中的处理一直存在限制。JEP 455 旨在将模式匹配和 switch
语句扩展到支持 Primitive 类型。
java
static String processInput(Object obj) {
return switch (obj) {
case Integer i -> "Integer value: %s".formatted(i);
case Double d -> "Double value: %s".formatted(d);
default -> "Unknown type";
};
}
public static void main(String[] args) {
System.out.println(processInput(10)); // 10
System.out.println(processInput(5.5)); // 5.5
}
这一功能使开发人员能够编写更简洁、更清晰的代码。
类文件 API
Java 的类文件格式对于字节码操作和工具开发至关重要。JEP 466 引入了新的类文件 API,简化了对 Java 类文件的访问和操作,无需开发人员依赖如 ASM 或 BCEL 这样的第三方库。
这个 API 将极大地惠及那些从事框架、编译器或需要检查或修改类文件的工具开发的人员。凭借其简洁的设计,它增强了灵活性,同时让开发人员更贴近 Java 的原生机制。下面是一个与新 API 交互的简单示例:
java
public static void main(String[] args) throws IOException {
ClassFile classFile = ClassFile.of();
ClassModel model=classFile.parse(Paths.get("/home/ExampleClass.class"));
System.out.println("Class Name: " + model.thisClass());
// Class Name: 7 java23/ExampleClass
model.methods().forEach(
method -> System.out.println(" - " + method.methodName()));
//- <init>
//- sayHello
}
流收集器
另一个特性是 Java 流 API 带来了非常不错的增强功能。主要目标是使流管道更灵活、更具表现力,并允许自定义中间操作来操作无限大小的流。以下是几个内置收集操作的示例:
java
Stream.of("A", "B", "C", "D", "E")
.gather(Gatherers.fold(() -> "", (a, b) -> a + b))
.forEach(System.out::println);
//ABCDE
Stream.of("A", "B", "C", "D")
.gather(Gatherers.windowFixed(2))
.forEach(System.out::println);
//[A, B]
//[C, D]
当然,也可以创建自己的收集器。为此,你只需要实现 java.util.stream.Gatherer
接口即可。
作用域值
JEP 481 引入了作用域值,这是一种线程局部变量的替代方案。它们提供了一种在特定作用域内共享值的机制,使多线程应用程序的开发变得更加轻松。让我们来看一个代码示例:
java
public class Jep481ScopedValues {
private static ScopedValue<String> X = ScopedValue.newInstance();
public static void main(String[] args) {
foo();
}
static void foo() {
ScopedValue.runWhere(X, "foo", () -> bar());
}
static void bar() {
System.out.println("Printing X from bar(): " + X.get());
ScopedValue.runWhere(X, "bar", () -> baz());
System.out.println("Printing X from bar(): " + X.get());
}
static void baz() {
System.out.println("Printing X from baz(): " + X.get());
}
}
// 输出结果:
Printing X from bar(): foo
Printing X from baz(): bar
Printing X from bar(): foo
灵活的构造函数体
JEP 482 重新审视了 Java 中构造函数的灵活性。传统上,Java 中的构造函数体在结构和异常处理方面的限制较多。这个 JEP 引入了更多的灵活性,允许开发人员在构造函数中编写更复杂的初始化逻辑,从而增强了对对象创建的控制。
java
public class Java481FlexibleConstructors extends BigInteger {
Java481FlexibleConstructors(long value) throws Exception {
if (value < 0) throw new Exception("Invalid value");
//之前无法做到这一点
System.out.println("Initialized with value: " + value);
super(String.valueOf(value));
}
}
Java 23 中的其他重要特性
除了我已经介绍的 JEP 之外,Java 23 还引入了一些其他值得提及的增强功能:
- 性能改进(JEP 474:默认启用 ZGC 代模式):Java 23 通过默认启用 Z 垃圾收集器的代模式来优化其性能。此功能通过在堆中将年轻对象和老对象分开,提高了垃圾收集性能,从而提升了内存管理的效率,特别是对于具有长期运行进程的应用程序。
- 安全更新(JEP 471:弃用
sun.misc.Unsafe
中的内存访问方法以供移除) :此更新弃用了sun.misc.Unsafe
中广泛用于直接内存操作的某些内存访问方法,从而增强了平台的安全性。 - 库增强(JEP 467:Markdown 文档注释):JEP 467 引入了对 Javadoc 注释中 Markdown 的支持。此功能允许开发人员在代码注释中使用 Markdown 语法编写格式更好、更易读的文档,从而改善内部和外部文档实践。
- 模块系统改进(JEP 476:模块导入声明):JEP 476 增加了在 Java 源文件中使用导入模块声明的能力。这简化了模块管理,特别是在多模块项目中,允许开发人员导入整个模块,而不仅仅是单个类或包。
总结
Java 持续发展,23 版本带来了大量能够提升开发人员体验的改进,从在模式匹配中更好地处理原始类型,到更灵活的构造函数和高级流处理功能。一定要探索这些变化,并开始将它们纳入你的开发流程------因为它们很快就会从预览特性转变为核心特性。