🌐 Programming Languages Mar 19, 2024 • 2 min read

Java 22: Mastering Unnamed Variables & The FFM API

Java 22: Mastering Unnamed Variables & The FFM API
JDK 22 Release tutorial

Java 22: Unnamed Patterns & FFM API

March 2024 marked a significant milestone. We are diving deep into two features that immediately impact developer productivity: the cleanup of unused variables and the new era of native interoperability.

🧹

JEP 456: The Art of Ignoring Things

Clean up your codebase with the underscore.

Breaking Change The underscore (_) is now a reserved keyword. You can no longer use it as a variable name in your logic.

For years, unused variables in catch blocks or loops created clutter and IDE warnings. Java 22 solves this with the unnamed variable.

1. Exception Handling

When the exception object is irrelevant, replace e with _.

try {
  int number = Integer.parseInt(input);
} catch (NumberFormatException _) {
  // Logic without 'e'
  System.out.println("Invalid input");
}

2. Enhanced For-Loops

Iterating for side effects? Stop inventing names like unused.

int count = 0;
for (var _ : orders) {
  count++;
}

🧩

JEP 454: Foreign Function & Memory API

Project Panama's crown jewel. Goodbye, JNI.

This API provides a pure Java mechanism to interoperate with code and data outside of the Java runtime (like C libraries) without the brittleness of JNI.

🛡️ Safety Strictly controlled memory access.
⚡ Performance Efficient invocation of foreign functions.
✨ Ease of Use No C headers or native glue code required.
FFMExample.java
// 1. Linker: Bridge Java and Native Code
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();

// 2. Find the 'strlen' function address
MemorySegment strlenAddress = stdlib.find("strlen").get();

// 3. Define descriptor: (Address) -> long
FunctionDescriptor descriptor = FunctionDescriptor.of(
    ValueLayout.JAVA_LONG, 
    ValueLayout.ADDRESS
);

MethodHandle strlen = linker.downcallHandle(strlenAddress, descriptor);

// 4. Arena: Safe off-heap memory management
try (Arena arena = Arena.ofConfined()) {
    MemorySegment cString = arena.allocateFrom("Hello Java 22");
    long len = (long) strlen.invoke(cString);
    System.out.println("Length: " + len);
}

This represents a paradigm shift for high-performance apps in AI and financial modeling where native interop is crucial.