[{"data":1,"prerenderedAt":172},["ShallowReactive",2],{"$fBBQ5ulyG5jVWbIBJe3r8F-kTKQKf1scMJiu0B6qzX5k":3,"$f7AVZHmPutZ23_8XKkLbDtEszKCuiY3yPjIDp9eRXGag":5,"$f0oSp5a_FfLaD1nRpI-Fr32KJWJvqo_p8E9mJ1x86_Cg":7,"$f5HsZGdCVCSO7Lu7xmOUrXkeaeW8gDq8eS_M4P_ISGPA":148},{"data":4},[],{"data":6},[],{"data":8,"meta":144},[9],{"id":10,"documentId":11,"title":12,"seo_title":13,"summary":14,"seo_description":15,"slug":16,"published_date":17,"body":18,"content":19,"createdAt":65,"updatedAt":66,"publishedAt":67,"blogauthor":68,"cover":90,"categories":133},403,"e5mosn23kz1dass7nzdh1guv","Большая распаковка Java 26. Что этот релиз значит для нас всех?","Java 26: что нового — 10 JEP и переход на релиз","Разбираем все изменения Java 26: от Structured Concurrency и final-полей до HTTP\u002F3 в HttpClient, и на практике переводим реальный проект на новую версию.","Обзор Java 26: 10 JEP, шестое превью Structured Concurrency, final-поля, ускорение G1 и ZGC, примитивы в паттернах, HTTP\u002F3 в HttpClient и переход проекта.","bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh","2026-04-13","Всего в релиз вошло 10 JEP-ов. Несколько я объединил в один блок, одним намеренно приберёг, чтобы рассказать о нём чуть позже. Будет немного практики — прямо в статье посмотрим, как перевести существующий проект на Java 26 и с чем придётся столкнуться. Статья также доступна в формате [видео](https:\u002F\u002Ft.me\u002Fopenide_official\u002F117).\n\n\u003Cdiv class=\"video-player\" data-youtube=\"ZhrlGOMgOIQ\" data-vk=\"-230816739_456239037\" data-rutube=\"42d24fb4b0e0c99f7207e35f38d28539\" data-rutube-key=\"i3vvzQJ6L0g7ImtRjEfuEA\">\u003Ciframe src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FZhrlGOMgOIQ\" width=\"100%\" height=\"400\" frameborder=\"0\" allowfullscreen loading=\"lazy\">\u003C\u002Fiframe>\u003C\u002Fdiv>\n\n\u003Ch2 id=\"kak-ustroen-put-fichi-v-jdk\">Как устроен путь фичи в JDK\u003C\u002Fh2>\n\nПрежде чем начать, небольшой экскурс для тех, кто не следит за структурой релизов внимательно: сначала фича появляется в инкубаторе, потом переходит в превью, потом может войти в финальный состав JDK. Инкубатор и превью включаются отдельными флагами — это сделано специально, чтобы собирать фидбэк, не давая гарантий стабильности API. В продакшн фичи из инкубатора и превью тащить не стоит: API может поменяться, и весь написанный под него код устареет. Думаю, так будет понятнее, что значит «N-е превью» или «N-й инкубатор» с практической точки зрения по ходу чтения статьи.\n\n---\n\n\u003Ch2 id=\"dva-sposoba-pereehat-na-java-26\">Два способа переехать на Java 26\u003C\u002Fh2>\n\nПрежде чем начать рассказывать про новые фичи, хочу ответить на самый главный вопрос: а как собственно получить эти фичи в своём проекте? На самом деле, нововведения можно поделить на два типа: те, которые мы используем напрямую (например, изменения в синтаксисе), и те, которые используем косвенно (например, улучшение сборщика мусора). Так вот, чтобы получить вторые — в случае с прекрасной экосистемой Java можно вообще практически ничего не делать.\n\n\u003Ch2 id=\"variant-1-prosto-menyaem-rantajm\">Вариант 1: просто меняем рантайм\u003C\u002Fh2>\n\nКод собирается под Java 24, запускается на Java 26. Синтаксис и зависимости не трогаем. Такой подход даёт бесплатный прирост от улучшений GC и других рантайм-оптимизаций без единого изменения в коде.\n\n![]({{strapiUrl}}\u002Fuploads\u002Fb389be54791d370f063fa706cdc7d29f_30ff33ef1a.webp)\n\nПересобираем, запускаем, подключаемся к контейнеру, выполняем `java -version` — видим Java 26. Переезд занял буквально 2 строчки в Dockerfile.\n\n> Пытливый читатель может задаться вопросом, а чего это у меня такой навороченный Dockerfile? К сожалению, кратко ответить на этот вопрос я не смогу. Рекомендую прочитать статью от ребят из Spring АйО: \"[Как должен выглядеть правильный Docker Image для Spring Boot приложения?](https:\u002F\u002Fhabr.com\u002Fru\u002Fcompanies\u002Fspring_aio\u002Farticles\u002F901302\u002F)\".\n\n\u003Ch2 id=\"variant-2-polnoczennyj-pereezd-menyaem-i-rantajm-i-language\">Вариант 2: полноценный переезд — меняем и рантайм, и language level\u003C\u002Fh2>\n\nДля этого потребуется обновить зависимости и сам Gradle\u002FMaven файл сборки. На практике переезд простенького проекта у меня прошёл практически бесшовно — приложение стартует, в логах видна Java 26, варнингов по Spring или зависимых библиотек нет.\n\n![]({{strapiUrl}}\u002Fuploads\u002F8754f38df5d2bc61b642e80beeb9424a_2c28102d2b.webp)\n\n---\n\n\u003Ch2 id=\"structured-concurrency-shestoe-prevyu\">Structured Concurrency — шестое превью\u003C\u002Fh2>\n\n[JEP 525](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F525). Первый инкубатор появился в Java 19, первое превью — в Java 21. Шесть превью и два инкубатора позади. Прошло практически 4 года с того момента, как мы увидели её в изначальном исполнении.\n\n![]({{strapiUrl}}\u002Fuploads\u002F2dd3f0f6f4cbedf31c21734f45939b26_9cdcdd5b3b.webp)\n\n> Суть проблемы: классические инструменты параллелизма — `ExecutorService`, `Future`, `CompletableFuture` — не знают ничего о связях между задачами. Если ты запустил три подзадачи для обработки одного запроса, они выполняются в разных потоках без общего «родителя» и без удобного способа координации.\n\nРазберём на примере. Нужно параллельно загрузить профиль, настройки и историю пользователя, и нам нужны все три результата — если хоть один упал, остальные нерелевантны.\n\nНиже пример без использования параллелизма. Попробуем написать его с существующим API языка, различными его вариациями.\n\n![Самый простейший случай, без параллелизма]({{strapiUrl}}\u002Fuploads\u002F6d0113e56eff44a03a68766cc694cf9f_8c0cc8e3c0.webp)\n\n1. **Вариант с ExecutorService + Future.** `.get()` вызывается последовательно: сначала ждём профиль, потом настройки, потом историю. Если настройки упали через секунду, а профиль отрабатывает 10 секунд — об ошибке узнаём только через 10 секунд. При `InterruptedException` оставшиеся задачи не отменяются.\n\n   ![]({{strapiUrl}}\u002Fuploads\u002Febdb4b3406b0c041e74341e61f2b6804_6e3cb41f71.webp)\n2. **Вариант с ручной отменой.** Можно добавить `cancel()` в `catch` — тогда при падении одной задачи явно отменяем остальные. Но узнаём об ошибке по-прежнему в самый последний момент, когда `.get()` доходит до упавшей задачи. Бойлерплейт растёт, проблема с поздней диагностикой провала никуда не делась.\n\n   ![]({{strapiUrl}}\u002Fuploads\u002Fe478f9b631da1fccb2558b1a3ee08800_d4cc6c70c0.webp)\n3. **Вариант с CompletableFuture.allOf.** `cancel(true)` отменяет `CompletableFuture`-обёртку, но не прерывает поток, который выполняет задачу — он продолжит работу до конца. Исключение приходит завёрнутым в `CompletionException → ExecutionException`. Вручную отменять задачи всё равно нужно.\n\n   ![]({{strapiUrl}}\u002Fuploads\u002Ffa6ee3d64d472c120477e33177ecb097_7ee5cd2d56.webp)\n4. **Structured Concurrency. Наконец, вишенка на торте. Прошу любить и жаловать приятный, лаконичный и удобный API для решения нашей задачи:**\n\n   ![]({{strapiUrl}}\u002Fuploads\u002Faa8138b1805a190fd3da473228506160_63553e7f7a.webp)\n\nЕсли любая задача упала — остальные отменяются автоматически. Поток-владелец всегда переживает все дочерние. Стектрейсы отражают реальную иерархию вызовов. Принцип тот же, что у `try-with-resources`: время жизни задач привязано к лексическому блоку.\n\nНа самом деле, мы уже могли написать нечто похожее и в версии Java 25. А вот что изменилось именно в Java 26:\n\n1. Скоуп теперь создаётся через статический `StructuredTaskScope.open()` вместо `new`.\n2. Метод `join()` возвращает `List` вместо `Stream` — результаты материализованы сразу, не нужно думать о ленивых вычислениях после закрытия скоупа.\n3. Добавился `joinUntil(deadline)` — если задачи не успели к дедлайну, скоуп их отменяет.\n\nИзменений с прошлого превью немного, API явно стабилизируется. Финализация, скорее всего, произойдёт довольно скоро. Но фича по прежнему в превью, поэтому тащить в продакшен я бы вам не советовал.\n\n---\n\n\u003Ch2 id=\"final-polya-konecz-dolgoj-istorii\">Final-поля: конец долгой истории\u003C\u002Fh2>\n\n[JEP 502](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F502). Этот JEP важен для всех, кто пишет на Spring, Hibernate — не потому что мы сами меняем final-поля через рефлексию, а потому что именно так работают большинство популярных фреймворков под капотом.\n\n![]({{strapiUrl}}\u002Fuploads\u002F88a2a7a48fe5ec8911dc3ee9da73c991_777fe5aa07.webp)\n\n\u003Ch3 id=\"kak-tak-poluchilos\">Как так получилось?\u003C\u002Fh3>\n\nКогда появилась сериализация\u002Fдесериализация, встала задача: как восстановить объект из байтов, у которого есть `final` поля? Вместо того чтобы сделать узкий механизм именно для этого случая, в Java 5 расширили общий `Field.set()` так, чтобы он мог писать в final-поля вообще для всех. Это было проще в реализации, но открыло лазейку всем желающим.\n\nЕй воспользовались все: Jackson, Hibernate, Spring, библиотеки мокирования и тестирования. Технически это работало. Семантически — нарушало контракт final. А у JIT не было и по прежнему нет возможности доверять final-полям и делать на их основе оптимизации, потому что кто угодно теоретически может такое поле изменить через рефлексию.\n\nДвадцать лет спустя это начинают исправлять.\n\n\u003Ch3 id=\"chto-izmenilos-v-java-26\">Что изменилось в Java 26?\u003C\u002Fh3>\n\nJVM начинает выдавать предупреждения, когда код меняет final-поле через рефлексию после завершения работы конструктора:\n\n```\nWARNING: Final field com.example.MyClass.value mutated after construction\n```\n\nПока только предупреждения. Используя специальный флаг эти предупреждения сейчас можно заглушить. Следующие шаги по плану: невозможность заглушить предупреждения, исключения, которые можно заглушить и, наконец, полный запрет подобного изменения значения final-поля.\n\nПравильное решение — использовать `sun.reflect.ReflectionFactory.newConstructorForSerialization()`. Этот API позволяет создать объект и установить final-поля _в момент его инициализации_, что JVM считает допустимым. Именно так сейчас работают Jackson 2.x и Hibernate, поэтому на современных проектах варнингов вы уже скорее всего и не встретите.\n\n```java\n\u002F\u002F Старый способ — то, что будет запрещено\nField field = MyClass.class.getDeclaredField(\"value\");\nfield.setAccessible(true);\nfield.set(instance, 42); \u002F\u002F WARNING в Java 26, исключение позже\n\n\u002F\u002F Новый способ через ReflectionFactory\nReflectionFactory rf = ReflectionFactory.getReflectionFactory();\nConstructor\u003C?> objCtor = Object.class.getDeclaredConstructor();\nConstructor\u003C?> serCtor = rf.newConstructorForSerialization(MyClass.class, objCtor);\nserCtor.setAccessible(true);\nMyClass instance = (MyClass) serCtor.newInstance(); \u002F\u002F final-поля устанавливаются здесь\n```\n\n\u003Ch3 id=\"chto-eto-oznachaet-na-praktike-dlya-nas-prostyh-rabotyag\">Что это означает на практике, для нас, простых работяг?\u003C\u002Fh3>\n\n1. **Spring 6.x и Hibernate** давно перешли на новый подход и внутренние механизмы JDK. На современных проектах предупреждений не будет.\n2. **Spring 5.x и старый Jackson** — при запуске на Java 26 в логах появятся варнинги. Приложение не упадёт, но это сигнал к обновлению.\n\nЯ проверял на своём проекте с [телеграм-ботом](https:\u002F\u002Ft.me\u002Famplicode\u002F262) на Spring Boot 3.5. Никаких ворнингов. А вот [Connekt](https:\u002F\u002Famplicode.ru\u002Fhttp-client\u002F) (HTTP-клиент в Amplicode\u002FOpenIDE) пока не обновился, и во время запросов через него в логах видны варнинги — что-то связанное с cookie storage использует старый подход.\n\n![]({{strapiUrl}}\u002Fuploads\u002Fa07c0d5b85bffac8ea85a421b21777cb_e37829b8e6.webp)\n\n---\n\n\u003Ch3 id=\"g1-i-zgc-besplatnyj-prirost-proizvoditelnosti\">G1 и ZGC: бесплатный прирост производительности\u003C\u002Fh3>\n\n1. [JEP 522](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F522) — улучшение пропускной способности G1. Не про latency, а именно про throughput — количество полезной работы в единицу времени.\n2. [JEP 519](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F519) — ZGC получил поддержку concurrent object pinning. Раньше при обращении к JNI отдельные объекты «пинились» и не двигались во время GC, что вызывало stop-the-world паузы. Теперь это происходит конкурентно. G1 — пока дефолтный сборщик, но всё движется к тому, что ZGC со временем займёт его место.\n\nПо результатам [прошлогоднего опроса](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Lbt09dIviDI) среди Java-разработчиков, лишь единицы занимаются тонкой настройкой GC. Большинству это не нужно — и в этом смысл: просто поменяй рантайм в Dockerfile, как показано выше, и получи несколько процентов прироста без единой строчки кода.\n\n> Кстати, чтобы мои заявления про \"большинство\" были менее голословными, пройди свежий [опрос от 2026 года](https:\u002F\u002Fsurvey.jugru.org\u002Fsoj2026?source=habr_java26&campaign=openide). В нём вопросы не только про Java, но и про AI-агентов, Spring, деплоймент, и так далее. Про всё, с чем Java-разработчикам приходится сталкиваться хотя-бы время от времени.\n>\n> Рекомендую [пройти](https:\u002F\u002Fsurvey.jugru.org\u002Fsoj2026?source=habr_java26&campaign=openide), чтобы понять насколько текущий стек твоей команды или твой лично вообще релевантен для РФ-рынка. Ну и плюс можно выиграть бесплатные билеты на конференции, тоже приятно :)\n\n![]({{strapiUrl}}\u002Fuploads\u002Fd7c5692bd325048af3be9a845cc000db_4fc85c173d.webp)\n\n---\n\n\u003Ch2 id=\"primitivy-v-patternah\">Примитивы в паттернах\u003C\u002Fh2>\n\n[JEP 530](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F530). Четвертое превью.\n\n![]({{strapiUrl}}\u002Fuploads\u002Fedd77c0febb8d61763ab27dd2212f9e8_d5aed1bc7f.webp)\n\nДо Java 26 паттерны в `switch` и `instanceof` работали только с reference-типами. `Integer` — ок, `int` — нет. Приходилось писать воркэраунды с явным приведением типа. Теперь:\n\n```java\nswitch (value) {\n    case int i when i > 100 -> \"big\";\n    case int i when i > 0   -> \"positive\";\n    default                  -> \"other\";\n}\n```\n\nИ в `instanceof`:\n\n```java\nif (value instanceof int i && i > 0) {\n    \u002F\u002F безопасное использование i\n}\n```\n\nПочему так не сделали с самого начала? Ну, это на самом деле не так уж и тривиально: reference-типы наследуются от Object, у них есть иерархия, по которой компилятор строит паттерны. У примитивов её нет. При этом между примитивами существуют неявные конверсии: `int` в `double`безопасно, `double` в `short` — нет, теряются данные. JEP вводит понятие safe conversions: компилятор знает, какие переходы разрешены без потери данных, и запрещает небезопасные статически.\n\nПока превью — в продакшн не тащим.\n\n---\n\n\u003Ch3 id=\"http-3-v-standartnom-httpclient\">HTTP\u002F3 в стандартном HttpClient\u003C\u002Fh3>\n\n[JEP 517](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F517). Финализированная фича!\n\n![]({{strapiUrl}}\u002Fuploads\u002Ffe79e6677164e1b24066a642f12992cc_4fe8a59039.webp)\n\nHTTP\u002F3 работает поверх QUIC (UDP) вместо TCP. Убирает проблему head-of-line blocking, лучше работает на нестабильных соединениях, быстрее устанавливает соединение.\n\nПо умолчанию `HttpClient` всё ещё использует HTTP\u002F2. HTTP\u002F3 нужно включать явно:\n\n```java\nHttpClient client = HttpClient.newBuilder()\n    .version(HttpClient.Version.HTTP_3)\n    .build();\n```\n\nЕсли сервер не поддерживает HTTP\u002F3 — клиент автоматически откатывается до HTTP\u002F2. Поэтому можно указывать `HTTP_3` без страха: как только сервер дорастёт до поддержки, оно заработает само. Чтобы видеть в логах, какая версия протокола реально использовалась, нужен VM-флаг `-Djdk.internal.httpclient.debug=true`.\n\n\u003Ch3 id=\"kak-podklyuchit-http-3-v-spring\">Как подключить HTTP\u002F3 в Spring\u003C\u002Fh3>\n\nВ Spring Boot начиная с версии 6.1 `RestClient` и `WebClient` используют стандартный Java `HttpClient` под капотом. Это значит, можно переопределить factory-бин и получить HTTP\u002F3 во всём приложении без низкоуровневого кода:\n\n```java\n@Configuration\npublic class Http3Config {\n    @Bean\n    JdkClientHttpRequestFactory jdkClientHttpRequestFactory() {\n        HttpClient client = HttpClient.newBuilder()\n                .version(HttpClient.Version.HTTP_3)\n                .build();\n\n        return new JdkClientHttpRequestFactory(client);\n    }\n\n    @Bean\n    RestClient restClient(JdkClientHttpRequestFactory jdkClientHttpRequestFactory) {\n        return RestClient.builder()\n                .requestFactory(jdkClientHttpRequestFactory)\n                .build();\n    }\n}\n```\n\nПосле этого везде, где заинжектирован `RestClient`, запросы пойдут по HTTP\u002F3. Я проверял с Connekt: запрос к нашему приложению идёт по HTTP\u002F1.1 (Connekt к нам так подключается), а запрос из приложения по `RestClient` к внешнему эндпоинту — по HTTP\u002F3. В логах это видно явно при включённом debug-флаге `-Djdk.httpclient.HttpClient.log=requests`.\n\n![]({{strapiUrl}}\u002Fuploads\u002F8024b476815e8c502e01e467fef0b42a_f9b7151b4a.webp)\n\n---\n\n\u003Ch3 id=\"vector-api-i-chto-eshhyo-ne-voshlo-v-obzor\">Vector API и что ещё не вошло в обзор\u003C\u002Fh3>\n\n1. **Vector API (**[**JEP 529**](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F529)**)** — одиннадцатый инкубатор. Не опечатка. Инкубатор → превью → финал — и вот одиннадцатый **инкубатор** подряд. Технология интересна для LLM-вычислений, но временной горизонт финализации кажется слишком далеким лично для меня, поэтому не стал в это лезть. Без комментариев.\n2. **Lazy Constants (**[**JEP 526**](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F526)**)** — интересная фича, но как то для неё не нашлось места в этой статье, разберу отдельно в [телеграм-канале](https:\u002F\u002Ft.me\u002Fopenide_official).\n3. **Удаление апплетов (**[**JEP 523**](https:\u002F\u002Fopenjdk.org\u002Fjeps\u002F523)**)** — ну, что поделать, ушла эпоха.\n\n![]({{strapiUrl}}\u002Fuploads\u002Fc56b26087a188121b23a62999c07d439_b386c8935c.webp)\n\nУже сейчас [OpenIDE](https:\u002F\u002Fopenide.ru\u002F) позволяет разрабатывать проекты на Java, Spring, Python, Go, JavaScript и TypeScript! А поддержка Docker и 300+ плагинов доступны абсолютно бесплатно в [маркетплейсе](https:\u002F\u002Fmarketplace.openide.ru\u002F). Пробуйте российскую IDE в деле и подписывайтесь на нас в [Telegram](https:\u002F\u002Ft.me\u002Fopenide_official) или [Max](https:\u002F\u002Fmax.ru\u002Fopenide), чтобы не пропустить свежие обновления и полезные материалы.\n\n---\n\n_Впервые опубликовано на [Хабре](https:\u002F\u002Fhabr.com\u002Fru\u002Fcompanies\u002Fhaulmont\u002Farticles\u002F1022864\u002F)._\n",[20],{"title":21,"links":22},"Содержание",[23,26,29,32,35,38,41,44,47,50,53,56,59,62],{"label":24,"href":25},"Как устроен путь фичи в JDK","#kak-ustroen-put-fichi-v-jdk",{"label":27,"href":28},"Два способа переехать на Java 26","#dva-sposoba-pereehat-na-java-26",{"label":30,"href":31},"Вариант 1: просто меняем рантайм","#variant-1-prosto-menyaem-rantajm",{"label":33,"href":34},"Вариант 2: полноценный переезд — меняем и рантайм, и language level","#variant-2-polnoczennyj-pereezd-menyaem-i-rantajm-i-language",{"label":36,"href":37},"Structured Concurrency — шестое превью","#structured-concurrency-shestoe-prevyu",{"label":39,"href":40},"Final-поля: конец долгой истории","#final-polya-konecz-dolgoj-istorii",{"label":42,"href":43},"Как так получилось?","#kak-tak-poluchilos",{"label":45,"href":46},"Что изменилось в Java 26?","#chto-izmenilos-v-java-26",{"label":48,"href":49},"Что это означает на практике, для нас, простых работяг?","#chto-eto-oznachaet-na-praktike-dlya-nas-prostyh-rabotyag",{"label":51,"href":52},"G1 и ZGC: бесплатный прирост производительности","#g1-i-zgc-besplatnyj-prirost-proizvoditelnosti",{"label":54,"href":55},"Примитивы в паттернах","#primitivy-v-patternah",{"label":57,"href":58},"HTTP\u002F3 в стандартном HttpClient","#http-3-v-standartnom-httpclient",{"label":60,"href":61},"Как подключить HTTP\u002F3 в Spring","#kak-podklyuchit-http-3-v-spring",{"label":63,"href":64},"Vector API и что ещё не вошло в обзор","#vector-api-i-chto-eshhyo-ne-voshlo-v-obzor","2026-11-12T11:31:30.954Z","2026-11-13T12:21:00.585Z","2026-11-13T12:21:01.054Z",{"id":69,"documentId":70,"firstname":71,"lastname":72,"createdAt":73,"updatedAt":74,"publishedAt":75,"slug":76,"photo":77},40,"yuewij1jc3qoxmkvsh2mpeny","Георгий","Власов","2026-02-17T11:40:25.168Z","2026-11-13T11:49:25.324Z","2026-11-13T11:49:25.371Z","georgij-vlasov",{"id":78,"documentId":79,"name":80,"alternativeText":81,"caption":81,"width":82,"height":82,"formats":81,"hash":83,"ext":84,"mime":85,"size":86,"url":87,"previewUrl":81,"provider":88,"provider_metadata":81,"createdAt":89,"updatedAt":89,"publishedAt":89,"focalPoint":81},1359,"jt1gpp4kqcyzwuwfhzj1c1vc","Gosha_ab88bd0ec5.webp",null,96,"Gosha_ab88bd0ec5_972867885d",".webp","image\u002Fwebp",2.14,"\u002Fuploads\u002FGosha_ab88bd0ec5_972867885d.webp","local","2026-11-13T11:47:15.450Z",{"id":91,"documentId":92,"name":93,"alternativeText":81,"caption":81,"width":94,"height":95,"formats":96,"hash":129,"ext":84,"mime":85,"size":130,"url":131,"previewUrl":81,"provider":88,"provider_metadata":81,"createdAt":132,"updatedAt":132,"publishedAt":132,"focalPoint":81},1196,"z3ufeg181ypw85708kd2sxlo","cover-bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh.webp",1280,720,{"thumbnail":97,"large":105,"medium":113,"small":121},{"name":98,"hash":99,"ext":84,"mime":85,"path":81,"width":100,"height":101,"size":102,"sizeInBytes":103,"url":104},"thumbnail_cover-bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh.webp","thumbnail_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1",245,138,3.52,3516,"\u002Fuploads\u002Fthumbnail_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1.webp",{"name":106,"hash":107,"ext":84,"mime":85,"path":81,"width":108,"height":109,"size":110,"sizeInBytes":111,"url":112},"large_cover-bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh.webp","large_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1",1000,562,20.69,20694,"\u002Fuploads\u002Flarge_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1.webp",{"name":114,"hash":115,"ext":84,"mime":85,"path":81,"width":116,"height":117,"size":118,"sizeInBytes":119,"url":120},"medium_cover-bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh.webp","medium_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1",750,422,15.21,15212,"\u002Fuploads\u002Fmedium_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1.webp",{"name":122,"hash":123,"ext":84,"mime":85,"path":81,"width":124,"height":125,"size":126,"sizeInBytes":127,"url":128},"small_cover-bolshaya-raspakovka-java-26-chto-etot-reliz-znachit-dlya-nas-vseh.webp","small_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1",500,281,9.08,9078,"\u002Fuploads\u002Fsmall_cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1.webp","cover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1",31.08,"\u002Fuploads\u002Fcover_bolshaya_raspakovka_java_26_chto_etot_reliz_znachit_dlya_nas_vseh_a2f866cba1.webp","2026-11-13T11:43:31.505Z",[134],{"id":135,"documentId":136,"title":137,"published":138,"weight":139,"slug":140,"createdAt":141,"updatedAt":142,"publishedAt":143,"color":81},5,"j3ptvz8nc7ijk3w80s01koxc","Обзоры",true,4,"reviews","2026-11-12T11:20:31.440Z","2026-11-12T11:22:44.313Z","2026-11-12T11:22:44.297Z",{"pagination":145},{"page":146,"pageSize":147,"pageCount":146,"total":146},1,25,{"data":149,"meta":168},[150,156,162],{"published_date":151,"id":152,"documentId":153,"title":154,"slug":155},"2026-07-21",359,"hrh0asxfdodwjoioqkqwta73","Заглядывая в будущее: Postgres 19. REPACK, SQL\u002FPGQ и умный autovacuum","zaglyadyvaya-v-budushhee-postgres-19-repack-sql-pgq-i-umnyj-autovacuum",{"published_date":157,"id":158,"documentId":159,"title":160,"slug":161},"2026-07-10",348,"vtjvnrwjysp7pg2m5yplwrr5","TypeScript 7.0 — самое радикальное обновление за 10 лет","typescript-7-0-samoe-radikalnoe-obnovlenie-za-10-let",{"published_date":163,"id":164,"documentId":165,"title":166,"slug":167},"2026-07-07",355,"szopwdkqo292rl7vrla29h52","Ленивые импорты в Python 3.15: как PEP 810 ускоряет старт приложений","lenivye-importy-v-python-3-15-kak-pep-810-uskoryaet-start-prilozhenij",{"pagination":169},{"page":146,"pageSize":170,"pageCount":170,"total":171},3,7,1794584602672]