Вчера вышла Java 25!Это версия с долговременной поддержкой, поэтому имеет смысл переходить на неё в ближайшее время. Она привносит следующие изменения:
1) import module — меньше бойлерплейта (JEP 511)Позволяет подтянуть экспортируемые пакеты модуля одной строкой — удобно для утилит и «скриптового» кода.
// List, Map, Path и пр. без отдельных import
import module java.base;
void main() {
var names = List.of("James", "Bill", "Guy");
IO.println(names);
}
2) Compact Source Files and Instance Main Methods (JEP 512)Можно запускать файл без создания явного класса. Метод
main() теперь не обязательно должен быть
static. Мы можем писать код в "скриптовом" стиле, что удобно для начинающих.
String msg = "Hello, Java 25!";
void main() {
IO.println(msg);
}
3) Flexible Constructor Bodies (JEP 513)Flexible Constructor Bodies, которые были в preview три релиза (Java 22, Java 23, Java 24), стали постоянной фичей языка. Теперь можно писать инструкции в конструкторе перед явным вызовом конструктора (
super() или
this()):
public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
if (value <= 0)
throw new IllegalArgumentException("non-positive value");
super(value);
}
}
4) Scoped Values (JEP 506)
Класс
ScopedValue позволяет обмениваться иммутабельными данными без их передачи через аргументы методов. Он является более оптимизированной альтернативой существующему классу
ThreadLocal.
private static final ScopedValue<FrameworkContext> CONTEXT = ScopedValue.newInstance();
void serve(Request request, Response response) {
var context = createContext(request);
ScopedValue.where(CONTEXT, context)
.run(() -> Application.handle(request, response));
}
public PersistedObject readKey(String key) {
var context = CONTEXT.get();
var db = getDBConnection(context);
db.readKey(key);
}
5) Компактные заголовки объектов (JEP 519)Включаются флагом
UseCompactObjectHeaders; экономят память и ускоряют сборку мусора.
java -XX:+UseCompactObjectHeaders -jar app.jar
Конечно же, это далеко не все изменения в Java 25. Всё перечисленное выше - уже
production-ready. Помимо этого в статусе очередного preview находятся ещё несколько интересных фич:
6) Примитивы в pattern/instanceof/switch — третий preview (JEP 507)
7) Stable Values — preview (JEP 502) - позволяет создавать неизменяемые поля с отложенной инициализацией
8) PEM-кодирование криптообъектов — preview (JEP 470)
9) Structured Concurrency — пятый preview (JEP 505)
10) Vector API (Tenth Incubator) (JEP 508)P.S. Мне, как человеку, который делает обучающие материалы по Java, особенно интересные фичи 1 и 2.
А что показалось наиболее интересным вам? Планируете ли переход на Java 25 в ближайшее время? Пишите в комментариях!