Java Development Kit 22, set to arrive in March 2024 as the next version of Java Standard Edition, has five features planned so far, with statements before
super(…) and string templates joining unnamed variables and patterns, a foreign function and memory API, and a seventh incubator of a vector API on the JDK 22 target list.
super(…) and string templates, both previews, were proposed within the last few days. Early-access builds of JDK 22 are available at jdk.java.net for Linux, Windows, and Mac.
The preview of statements before
super(…) pertains to constructors in the language, allowing statements that do not reference the instance being created to appear before an explicit constructor. A goal of the plan includes giving developers greater freedom to express the behavior of constructors, enabling more natural placement of logic that currently must be factored into auxiliary static methods, auxiliary intermediate constructors, or constructor arguments.
Another goal is preserving the existing guarantee that constructors run in top-down order during class instantiation, ensuring that code in a subclass constructor cannot interfere with superclass instantiation. A third stated goal is not requiring any changes to the JVM. This is the only JDK 22 feature, so far, that has not yet been previously previewed or incubated in standard Java.
String templates, in a second preview in JDK 22, would complement Java’s existing string literals and text blocks by coupling literal text with embedded expressions and template processors to produce specialized results. Goals include:
- Simplifying the writing of Java programs by making it easy to express strings that include values computed at run time.
- Enhancing the readability of expressions that mix text and expressions, whether the text fits on a single source line or spans several source lines.
- Improving security of programs that compose strings from user-provided values and pass them to other systems by supporting validation and transformation of both the template and the values of its embedded expressions.
- Retaining flexibility by allowing Java libraries to define the formatting syntax used in string templates.
- Simplifying the use of APIs that accept strings written in non-Java languages, such as XML and JSON.
- Enabling creation of non-string values computed from literal text and embedded expressions without needing to transit through an intermediate string representation.
String templates appear in a first preview in JDK 21. The second preview is intended to gain additional experience and feedback. Except for a technical change in the types of template expressions, there are no changes relative to the first preview.
A vector API (seventh incubator) would express vector computations that reliably compile at runtime to optimal vector instructions on supported CPU architectures, achieving performance superior to equivalent scalar computations. The API provides a way to write complex vector algorithms in Java, using the existing HotSpot auto-vectorization algorithm but with a user model that makes vectorization more predictable and robust.
This capability has been incubated in prior versions of Java dating back to JDK 16 in March 2021. Goals of the API include it being clear and concise, platform-agnostic, and offering reliable runtime compilation and performance on x64 AArch64 architectures as well as graceful degradation. This capability is intended to leverage Project Valhalla enhancements to the Java object model, enabling programs to work with value objects.
Unnamed variables and patterns can be used when variable declarations or nested patterns are required but never used. Goals of the plan include:
- Capturing developer intent that a given binding or lambda parameter is unused, and enforcing that property to clarify programs and reduce opportunities for error
- Improving code maintainability by identifying variables that must be declared but are not used
- Allowing multiple patterns to appear in a single case label, provided that none of them declares pattern variables
- Improving the readability of record patterns by eliding unnecessary nested type patterns
This proposal was previewed in JDK 21 and would be finalized without change in JDK 22.
The foreign function and memory API allows Java programs to interoperate with code and data outside of the Java runtime. By invoking foreign functions and safely accessing foreign memory, Java programs can call native libraries and process native data without the brittleness of JNI (Java Native Interface), the proposal states.
The foreign function and memory API previously was previewed in JDK 19, JDK 20, and JDK 21. It would be finalized in JDK 22. The latest revisions cover three areas: supporting arbitrary charsets for native strings, enabling clients to build C-language function descriptors programmatically, and introducing the Enable-Native-Access JAR-file manifest attribute. The latter allows executable JAR files to call restricted methods without having to use the —enable-native-access command-line option.
Due March 19, 2024, Java 22 is a Feature release that will receive six months of support from Oracle, unlike just-released JDK 21, which is a Long Term Support (LTS) release that will receive at least eight years of support. Companies besides Oracle could offer longer support for JDK 22 if they so choose. Standard Java updates occur every six months, and LTS releases arrive every two years.
Other capabilities likely to appear in JDK 22 include features also previously previewed, such as string templates and unnamed classes and instance main methods. Other capabilities that could make their first appearance in JDK 22 include previews of a class-file API for parsing, transforming, and generating Java files, and computed constants, which are immutable value holders that are initialized at most once. A Java stream gatherers proposal to improve stream operations also is a possibility.
Prior to general availability, JDK 22 is set to go through rampdown phases in December and January, followed by two release candidates in February 2024.
Copyright © 2023 IDG Communications, Inc.