JDK 28 выходит с value-классами Java — но плоского ArrayList все ещё нет
Добавьте одно слово — value — к классу, и JVM перестанет хранить указатели на разрозненные объекты в куче и упакует данные плотно: 8 байт на Point, без заголовков. Десять лет Project Valhalla — и вот наконец превью.
Изменение затронуло 197 000 строк в 1 816 файлах. Integer, Long и Double тихо теряют объектную идентичность. И главная фича — плоский ArrayList<Point> — явно не вошла в релиз.
Brian Goetz заранее парировал критиков: те, кто говорил «никогда не выпустят», теперь переключатся на «но самое важное всё равно не выпустили». Читатели нашли сноску, где неверно утверждалось, что у C# struct «есть идентичность», — рядом с ИИ-сгенерированными диаграммами, и задались вопросом, что ещё в статье написала нейросеть.
Одно слово, которое меняет расположение данных в памяти

Разбор JVM Weekly объясняет, что реально попадёт в JDK 28 после десяти лет Project Valhalla. Суть: класс с модификатором value теряет идентичность. Его поля неявно финальны, нельзя синхронизироваться на нём, а == сравнивает содержимое, а не адрес памяти. Слоган: «пишется как класс, работает как int».
Выигрыш — в размещении данных. Массив Point[] сегодня — это массив указателей на разрозненные объекты в куче, каждый со своим заголовком. Объявите Point value-классом, и JVM сможет хранить значения инлайн: примерно 8 байт на точку (плюс возможный флаг null), непрерывно, без заголовков на каждый элемент, без разыменования указателей. Объём изменений огромен: 197 000 строк в 1 816 файлах, в 2 819 коммитах.
Чего пока нет
То, чего большинство читателей и ждало, явно отложено:
«Получу ли я быстрый плоский
ArrayList<Point>? Пока нет. Грустно. Надеюсь, это появится к следующей LTS.» — комментатор о пропавших плоских коллекциях
Также не вошли в релиз: ненулевые value-типы, полноценные специализированные дженерики, 128-битные атомики. Классы-обёртки Integer, Long, Double в превью тихо становятся value-классами — и теряют идентичность. Один из читателей с 15k+ кармы счёл этот факт роковым для мечты о включении по умолчанию:
«Уверен, что включить это в продакшне, где код может опираться на идентичность упакованных чисел, будет тривиально просто... теперь у нас будет ещё десятилетие двух диалектов Java (один с value-типами, другой без)... прямо как python3.» — комментатор, развернувший критику «корабля Тесея»
Руководитель проекта Brian Goetz был готов к этому заранее: он назвал релиз «только первой частью Valhalla» и предсказал, что лагерь «никогда не выпустят» переключится на «но самое важное всё равно не выпустили».
Неверная сноска — и ИИ-изображения
Самое болезненное открытие треда — фактическая ошибка в самой статье. В сноске утверждалось, что у C# struct «есть идентичность». Двое читателей, работавших с C#, возразили:
«С каких пор? Насколько я помню, у структур не было идентичности, и добавить её было бы очень странным решением.» — автор клиентского JS-фреймворка
Эта ошибка оказалась рядом с ИИ-сгенерированными диаграммами, и разработчик игрового движка сделал очевидный вывод:
«Сноска 6 «Чем это отличается от struct в C#» неверна. Раз статья пестрит ИИ-изображениями, полагаю, текст или хотя бы исследования тоже полны галлюцинаций.» — комментатор, поставивший под сомнение достоверность статьи
ИИ-инструменты оставили след прямо в тексте: подпись к одному изображению оказалась сырым плейсхолдером LLM — [IMAGE: the same Point[] array in two variants…] — что один из читателей назвал «крашем постобработки изображений».
Подводный камень, который пугает тех, кто будет это использовать
За спорами о языке инженеры указали на реальную семантическую мину. Плоские данные нужно читать и писать атомарно, иначе произойдёт «разрыв» при конкурентном доступе, поэтому при размере значения, превышающем возможности атомарной записи платформы, выравнивание молча откатывается к выделению памяти в куче. Один читатель ёмко выразил тревогу:
««Плюс флаг null» — это будет GIL для JVM.» — комментатор о скрытой цене null-бита
Достижение реальное: value-тип, который выглядит как обычный Java-код, после процесса разработки, ставшего внутренней шуткой сообщества. Но «пишется как класс, работает как int» уже имеет звёздочку: int никогда не бывает null, а эти типы — могут. Спор о том, появится ли когда-нибудь всё остальное, просто сменил лозунг.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
Amazon вложил $50 млрд в OpenAI и тут же отказался от готового фильма про Сэма Альтмана
Фильм Луки Гуаданьино «Artificial» — Эндрю Гарфилд в роли Сэма Альтмана, история увольнения и возвращения в ноябре 2023-го — был почти готов. Потом Amazon вложил $50 млрд в OpenAI, и студия внезапно решила, что кто-то другой должен его выпустить.