Самое большое изменение языка Java за десятилетие наконец-то происходит. Это потребовало 197 000 строк кода.
TL;DRПроект Valhalla вводит классы значений в JDK 28, изменение на 197,000 строк, которое переписывает то, как Java обрабатывает идентичность объектов. Инженер Oracle Лоис Фолтан подтвердила, что Предложение по улучшению Java 401, которое вводит классы значений и объекты в язык, будет интегрировано в основную ветку OpenJDK в начале следующего месяца с целевым выпуском JDK 28. Это изменение является частью Проекта Valhalla, долгосрочной инициативы по устранению одной из старейших ограничений производительности Java. Запрос на изменение добавляет более 197,000 строк кода в 1,816 измененных файлах, согласно The Register. Фолтан описала это как "чрезвычайно большое изменение" в сообщении на почтовом списке OpenJDK и попросила других участников избегать крупных коммитов в течение окна интеграции. Текущий комплект разработки Java — версия 26, ожидается, что JDK 27 выйдет в сентябре 2026 года, а JDK 28 — в марте 2027 года. JEP 401 появится как предварительная функция, что означает, что разработчики могут включить ее, но она не будет включена по умолчанию. Проблема, которую решает JEP 401, является фундаментальной для работы Java. За пределами небольшого набора примитивов, таких как int, char и double, каждый тип в Java является ссылочным типом. Это означает, что каждый объект получает свою уникальную идентичность в памяти, даже когда два объекта содержат идентичные данные. Класс LocalDate в Java, например, хранит значения дат, но два экземпляра, представляющие одну и ту же дату, вернут false при сравнении с оператором ==, потому что это разные объекты в памяти. Обертка класса Integer делает это еще более запутанным. Java внутренне кэширует экземпляры Integer для значений ниже 128, поэтому два объекта Integer с одинаковым малым значением могут сравниваться как равные с помощью ==. Для больших значений == всегда возвращает false, даже когда базовые числа совпадают. JEP 401 описывает это поведение как "нежелательную сложность", и редакторы Java обычно предупреждают против использования == с Integer в результате. Классы значений устраняют эту проблему, создавая объекты, которые полностью лишены идентичности. Значимый объект определяется исключительно значениями своих полей, а не тем, где он находится в памяти. Это дает JVM свободу хранить объекты значений таким образом, который снижает накладные расходы на память и улучшает локальность кэша. Итерация по типам значений более эффективна, потому что время выполнения не нужно разыменовывать указатели, чтобы получить доступ к фактическим данным. JEP 401 мигрирует некоторые существующие классы JDK, включая Integer, в классы значений. Ожидается, что количество мигрированных классов будет постепенно расти в последующих выпусках. Разработчики также смогут объявлять свои собственные классы значений для доменных типов, представляющих чистые данные, такие как координаты, суммы валюты или временные метки. Проект Valhalla разрабатывается с 2014 года, что делает его одним из самых долгосрочных усилий в истории Java. Сложность изменения того, как работает идентичность объектов на уровне JVM, при сохранении обратной совместимости с миллиардами строк существующего кода Java объясняет временные рамки. Некоторые наблюдатели шутят о том, что проект может достичь самого Вальгаллы, загробного мира в скандинавской мифологии, прежде чем он будет выпущен. Архитектор языка Java Oracle Брайан Гетц предостерег на Reddit, что JEP 401 — "это всего лишь первая часть Valhalla". Он сказал, что удаление идентичности является первым барьером, который открывает новые оптимизации, особенно для меньших объектов. Но полное обращение с объектами с семантикой значений требует отказаться от большего, включая возможность null и то, что Гетц назвал "атомарностью-безопасностью-под-влиянием". Он сравнил траекторию с структурами C#, отметив, что другие языки работают над аналогичными возможностями. Гетц также предупредил, что Valhalla введет преднамеренные разрушающие изменения. Код, который синхронизируется на объектах Integer, например, завершится с исключением, как только Integer станет классом значений. Он сказал, что JEP 401, вероятно, все еще будет в предварительном режиме в следующем выпуске долгосрочной поддержки JDK, который ожидается как JDK 29 в сентябре 2027 года. "Надеяться, что он выйдет из предварительного режима для 29, кажется ... оптимистичным", — написал он. Время совпадает с тем, как Oracle активно реорганизуется, сокращая до 30,000 сотрудников, чтобы финансировать свой переход к инфраструктуре ИИ. Но команда платформы Java, похоже, в значительной степени защищена от этих сокращений, и Проект Valhalla представляет собой тот вид глубокой языковой работы, который нельзя ускорить, привлекая больше инженеров. Java приобрела более восьми миллионов новых разработчиков с 2021 по 2023 год, и ее актуальность для облачных вычислений и корпоративных систем означает, что любое фундаментальное улучшение производительности оказывает влияние на обширную экосистему. Для миллионов разработчиков Java, которые ждали двенадцать лет для типов значений, предварительный просмотр в JDK 28 является вехой. Для остальной части Valhalla сообщение Гетца ясно: не держите дыхание.
Другие статьи
Самое большое изменение языка Java за десятилетие наконец-то происходит. Это потребовало 197 000 строк кода.
Проект Valhalla's JEP 401 принесет классы значений в JDK 28, убирая идентичность объектов из типов Java в изменении на 197,000 строк, которое готовилось двенадцать лет.
