🚀 Вышел релиз JDK 23!Большинство нововведений находится в Preview:
1.
Primitive Types in Patterns, instanceof, and switch (JEP 455, Preview) - Расширяет возможности паттерн-матчинга для примитивных типов и позволяет использовать примитивные типы в switch
Пример:
switch (x.getStatus()) {
case 0 -> "okay";
case 1 -> "warning";
case 2 -> "error";
case int i -> "unknown status: " + i;
}
2.
Class-File API (JEP 466, Second Preview) - Стандартизированный API для работы с байткодом Java
- Упрощает разработку инструментов анализа и генерации кода
3.
Markdown Documentation Comments (JEP 467) - Позволяет использовать Markdown в JavaDoc
- Улучшает читаемость документации в исходном коде
4.
Vector API (JEP 469, Eighth Incubator) - Улучшает производительность векторных вычислений
- Оптимизирует использование SIMD-инструкций процессора
5.
Stream Gatherers (JEP 473, Second Preview) - Вводит интерфейс Gatherer для определения пользовательских операций над стримами
Пример:
static <T> Gatherer<T, ?, List<T>> fixedSizeChunks(int size) {
return Gatherer.ofSequential(
() -> new ArrayList<T>(size),
(chunk, element, downstream) -> {
chunk.add(element);
if (chunk.size() == size) {
downstream.push(new ArrayList<>(chunk));
chunk.clear();
}
return true;
},
(chunk, downstream) -> {
if (!chunk.isEmpty()) {
downstream.push(chunk);
}
}
);
}
List<List<Integer>> result = Stream.of(1, 2, 3, 4, 5, 6, 7)
.gather(fixedSizeChunks(3))
.toList();
6.
ZGC: Generational Mode by Default (JEP 474) - Улучшает производительность сборщика мусора ZGC
7.
Module Import Declarations (JEP 476, Preview) - Упрощает импорт всех экспортируемых пакетов модуля
- Уменьшает количество import-statements в коде
Пример:
import module java.base;
// Теперь доступны все классы из java.base без дополнительных импортов
var list = new ArrayList<String>();
var path = Path.of("file.txt");
8.
Implicitly Declared Classes and Instance Main Methods (JEP 477, Third Preview)
- Упрощает написание небольших программ
- Позволяет запускать код без явного объявления класса
Пример:
void main() {
System.out.println("Hello, World!");
}
9.
Structured Concurrency (JEP 480, Third Preview)
- Вводит класс StructuredTaskScope для управления группами связанных задач
- Позволяет рассматривать несколько задач как единую рабочую единицу
- Автоматизирует обработку ошибок и отмену задач
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> user = scope.fork(() -> findUser());
Future<Integer> order = scope.fork(() -> fetchOrder());
scope.join();
scope.throwIfFailed();
processData(user.resultNow(), order.resultNow());
}
10. Scoped Values (JEP 481, Third Preview)
- Вводит класс ScopedValue как альтернативу ThreadLocal
- Обеспечивает неизменяемость данных в рамках определенной области видимости.
- Эффективно работает с виртуальными потоками
Пример:
final static ScopedValue<String> USER_ID = ScopedValue.newInstance();
void processRequest(String userId) {
ScopedValue.where(USER_ID, userId).run(() -> {
String id = USER_ID.get();
performTask();
auditLog();
});
}
void performTask() {
String id = USER_ID.get();
//...
}
void auditLog() {
String id = USER_ID.get();
logger.info("Operation performed for user: " + id);
}
11.
Flexible Constructor Bodies (JEP 482, Second Preview)
- Позволяет размещать код до вызова super() или this()
Пример:
class Example extends Parent {
private final int value;
Example(int value) {
if (value < 0) throw new IllegalArgumentException("Value must be non-negative");
this.value = value;
super(value);
}
}
Подробнее: https://openjdk.org/projects/jdk/23/