Добавить объявление

В Java наконец-то завезли нормальные опциональные типы?

Пока одни языки давно спят спокойно с опционалами, в лагере Java - историческое событие. OpenJDK опубликовал черновик JEP, который добавляет в язык String! (никогда не null) и String? (может быть null). Выглядит как фича, которая должна была появиться лет 10 назад, но лучше поздно, чем никогда. Правда, это пока preview, включается флагом --enable-preview, до LTS еще пилить и пилить.

Что изменилось в Java:


Типы теперь можно помечать. String! - компилятор будет ругаться, если туда попытаются положить null. String? - явное разрешение на null. Обычный String без пометки остается «непонятным» - null может быть, но intent не указан.

Под капотом это не просто синтаксис. Для Valhalla (проект по value-типам) такие аннотации критичны: если тип гарантированно не содержит null, JVM может жестче оптимизировать память, упаковывать данные плотнее и не тратить биты на хранение признака null.

Что изменится для разработчика:


В теории - меньше NullPointerException. На практике - придется привыкать к восклицательным знакам в типах. Особенно если проект захочет перейти на null-safe by default. Пока это preview-фича, включается флагом --enable-preview. До релиза - как до луны.

Проблема внедрения:


Самое сложное - не придумать синтаксис, а заставить экосистему его переварить. Библиотеки, написанные без маркеров, будут восприниматься как String (неизвестно). Чтобы реально работать с null-безопасностью, придется либо всюду таскать ! и ?, либо вводить модульные флаги («в этом модуле все типы по умолчанию ненулябельны»). А это уже раскол языка на «старый» и «новый» стиль.

Kotlin тихо улыбается в углу:


В Kotlin это все работает из коробки, с обратной совместимостью и без флагов. Да, ценой отдельного языка, но результат уже широко используется. Java с ее «никогда не ломаем обратную совместимость» тащит этот груз уже 30 лет. И сейчас пытается привить себе фичи, которые в других языках стали стандартом еще в прошлом десятилетии.

Что в итоге:


Прогресс есть. Через пару LTS-версий (если фича доживет до релиза) у Java появится нормальная работа с null на уровне типов. Но а пока, большинство проектов продолжат сидеть на 8-й, 11-й или 17-й версии, потому что они стабильны и привычны. А разработчики - страдать от NPE в рантайме и завидовать соседям.
27.02.2026 32 275