Реліз Java 21: Long live a new LTS!
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Минуло півроку, і цей день настав, знов! Офіційний реліз JDK 21 уже сьогодні (19 вересня), уже зараз! А це означає, що треба розібратися, що ж тут нового, бо це найбільший та вкрай важливий реліз для Java-спільноти.
Java 21 general availability
Ми, Oracle, та безпосередньо Java Platform Group, з гордістю оголошуємо про загальну доступність JDK 21. Цей реліз є дванадцятим за рахунком функціональним випуском, який зʼявляється в рамках шестимісячної каденції. Такий рівень передбачуваності дозволяє розробникам легко керувати впровадженням інновацій завдяки постійному потоку очікуваних покращень.
Java 21 general availability
Oracle надаватиме довгострокову підтримку Java 21 щонайменше протягом восьми років. Завдяки таким тривалим періодам підтримки організації та компанії мають гнучкість, яка дозволяє довше підтримувати додатки у виробництві з мінімальними витратами на обслуговування, а згодом мігрувати на власних умовах. На основі відгуків наших клієнтів, комʼюніті та використання в екосистемі Java, Oracle також оголосила, що довгострокова підтримка Java 11 була подовжена як мінімум до січня 2032 року. Це забезпечить щонайменше ще вісім років підтримки та оновлень від Oracle.
Вклад компаній у Java 21
Як і під час минулих релізів, Java 21 відзначає внесок багатьох людей та організацій у спільноту OpenJDK — ми всі разом створюємо Java!
Швидкість змін у релізах JDK протягом багатьох років залишалася практично однаковою, але за шестимісячної каденції темп, з яким надаються готові до використання функції (standard features) та покращення, різко збільшився.
Замість того, щоб вносити десятки тисяч виправлень і випускати близько сотні JEP (JDK Enhancement Proposal) кожні кілька років (як це було з релізами JDK 8 та JDK 9), покращення випускаються у скорочених функціональних релізах за більш керованим і передбачуваним шестимісячним графіком. Зміни, які вносяться в JDK, варіюються від значних нових функцій (Virtual Threads, Pattern Matching) до невеликих удосконалень для рутинного обслуговування JDK, виправлення помилок і поліпшення документації. Кожна зміна представлена у вигляді однієї фіксації стану JDK (відповідної дорелізної фази, наприклад, як зараз JDK 21 build 35) для одного релізу в bug-трекері JDK.
Із 24 196 тікетів JIRA, позначених як виправлені в Java 11 — Java 21 на момент їх GA, 17 288 були завершені людьми, що працюють в Oracle, тоді як 6 908 були внесені індивідуальними розробниками та розробницями, що працюють в інших компаніях. Переглянувши проблеми та зіставивши дані, отримані від правонаступників, ми отримали таку діаграму організацій, які спонсорували розробку внесків у Java:
У Java 21 з 2585 JIRA-тікетів, позначених як виправлені, 1868 було завершено командою Oracle, а 717 надано іншими членами спільноти розробників Java. Ми висловлюємо подяку розробникам, які працюють в таких організаціях, як Amazon, ARM, Azul, Google, Huawei, IBM, Intel, ISCAS, Red Hat, Rivos, SAP і Tencent, за їхній значний внесок. Ми вдячні за внесок менших компаній, таких як Bellsoft та Loongson, а також незалежних розробників, які в сукупності внесли 8% виправлень у Java 21.
Крім того, через програму OpenJDK Quality Outreach ми хотіли б подякувати проєктам FOSS, які надали чудові відгуки про тестування збірок раннього доступу Java 21, щоб допомогти поліпшити якість випуску:
- Apache Commons
- Apache ZooKeeper
- AssertJ
- BNYM Code Katas
- JUnit5
- Karate
- MyBatis
Що нового у JDK 21
Поряд з багатьма оновленнями продуктивності, стабільності та безпеки, Java 21 надає десятки нових функцій. 15 з них є достатньо важливими для того, щоб отримати власні пропозиції щодо вдосконалення JDK (JEP), що охоплюють шість preview features та одну incubated feature.
JEP preview feature — це повністю визначений та реалізований функціонал мови або віртуальної машини платформи Java SE, але слід врахувати, що preview features не просто так у стані preview — функціонал або інтерфейс не є сталим. Ці нові можливості стають доступними у випусках функцій JDK, щоб забезпечити з розробниками зворотний зв’язок, заснований на реальному використанні нового коду, перш ніж нові компоненти мови та runtime стануть постійними в майбутньому випуску. Це також дає постачальникам інструментів з екосистеми Java можливість працювати над підтримкою функцій до того, як вони будуть фіналізовані в стандарті Java SE.
JEP Incubator Modules дозволяють надавати не кінцеві API та інструменти в руки розробників і користувачів, щоб зібрати відгуки, які в підсумку покращать якість платформи Java шляхом зворотнього звʼязку від користувачів до розробників.
15 JEP, що увійшли до релізу Java 21, згруповані у шість категорій, які відповідають ключовим довгостроковим проєктам у сфері технології Java та апаратної підтримки.
Project Amber
JEP 430: String Templates (Preview). Мета та цілі:
- спрощує написання програм на Java, дозволяючи легко виражати змінні типу String, які містять значення, обчислені під час виконання;
- покращує читабельність String, які поєднують текст і вирази, незалежно від того, чи вміщується текст в одному рядку коду (як у випадку з рядковими літералами), чи охоплює декілька рядків (як у випадку з text blocks);
- підвищує безпеку Java-програм, які складають рядки з наданих користувачем значень і передають їх іншим системам (наприклад, створюють запити до баз даних), підтримуючи перевірку і перетворення як шаблону, так і значень вбудованих виразів;
- зберігає гнучкість, дозволяючи бібліотекам Java визначати синтаксис форматування, що використовується в шаблонах рядків;
- спрощує використання API, які приймають значення типу String, написані мовами, відмінними від Java (наприклад, SQL, XML і JSON);
- дозволяє створювати нестрокові значення, обчислені з буквального тексту та вбудованих обчислень, без необхідності переходу через проміжне рядкове представлення.
Головна цінність JEP 430 — впровадити String-templates, які є вкрай корисними для різного типу промтів AI, HTML-templates та дуже простих JSON, XML, YAML.
JEP 440: Record Patterns. Мета цього JEP: ще глибше проробити patter matching для Java Record, що дасть змогу деконструювати відповідний Record на його складові.
JEP 441: Pattern matching for switch. Головною задачею є вдосконалити мову програмування Java за допомогою зіставлення шаблонів для виразів і операторів switch. Розширення зіставлення шаблонів на switch дозволяє перевіряти вираз на відповідність декільком шаблонам, кожен з яких виконує певну дію, що дозволяє лаконічно і безпечно формулювати складні запити, орієнтовані на дані.
JEP 443: Unnamed Patterns and Variables (Preview). Метою цього JEP є доповнити мову Java неіменованими шаблонами, які відповідають компоненту запису без зазначення імені або типу компонента, та неіменованими змінними, які можна ініціалізувати, але не використовувати. Обидва типи позначаються символом підкреслення _
. Неіменовані шаблони та паттерни вже давно існують в інших мовах програмування, то ж настав час впровадити їх у Java та JDK.
JEP 445: Unnamed Classes and Instance Main Methods (Preview). Одною з проблем при вивченні мови програмування Java є їхня виразність та досить високий рівень складності. А якщо порівнювати простоту написання hello world з іншими мовами програмування типу Python, C, то ситуація стає взагалі сумною. Тож для спрощення вивчення мови програмування були впроваджені неіменовані класи, які допоможуть новачкам простіше орієнтуватися на самому початку. Метою такого рішення було бажання докорінно змінити баланс мов програмувань, показуючи простоту Java для дітей та студентів вишів.
Project Loom
JEP 444: Virtual Threads. Тут і казати нічого, вже було сказано і показано багато. Це одна із найгарячіших тем останнього року в спільноті Java. Тепер офіційно! Віртуальні потоки стали стандартним функціоналом JDK і дадуть змогу підвищити продуктивність мережевих застосунків у межах меншої кількості ресурсів.
JEP 446: Scoped Values (Preview). Метою команди Projet Loom є введення значень з певною областю видимості (доступності) значення, які можна безпечно та ефективно передавати методам без використання параметрів методу. Їм надається перевага перед локальними змінними потоку (ThreadLocal), особливо при використанні великої кількості віртуальних потоків. API ще у стані Preview feature. По суті, значення з областю видимості є неявним параметром методу. Це нібито кожен метод у послідовності викликів має додатковий, невидимий параметр. Жоден з методів не оголошує цей параметр, і тільки методи, які мають доступ до об’єкта scoped value, можуть отримати доступ до його значення (даних). Значення з областю видимості дозволяють безпечно передавати дані від того, хто їх викликає, до віддаленого абонента через послідовність проміжних методів, які не оголошують параметр для даних і не мають доступу до них.
JEP 453: Structured Concurrency (Preview). Перехід від асинхронної моделі програмування до структурного паралелізму вимагає наявності сегментів виконання паралельного коду. Для цього вводиться конструкція Structured Concurrency з метою спрощення паралельного програмування за допомогою API для структурованого паралелізму. Структурований паралелізм розглядає групи пов’язаних завдань, що виконуються в різних потоках, як єдину робочу одиницю, тим самим спрощуючи обробку та скасування помилок, підвищуючи надійність та покращуючи спостережливість.
Project Panama
JEP 442: Foreign Function & Memory API (3rd Preview). Як і декілька релізів до цього, метою було впровадити комплекс API, за допомогою якого Java-програми можуть взаємодіяти з кодом і даними поза межами runtime Java, а саме: мовами типу C/C++. Ефективно викликаючи нативні функції (тобто код за межами JVM) та безпечно отримуючи доступ до всієї області наявної пам’яті (тобто пам’яті, якою не керує JVM), API дозволяє Java-програмам викликати нативні бібліотеки та обробляти власні дані без крихкості та небезпеки JNI.
JEP 448: Vector API (Sixth Incubator). Основною метою є впровадження Java-реалізації до SIMD (векторних обчислень на регістрах процессорів архітектури amd64 та сімействі процесорів ARM). Векторні обчислення дозволяють робити багато математичних операцій над сегментами даних від 128 до 512 біт одночасно (розмірність залежить від типу, архітектури та покоління процесору). Ці операції дуже важливі для криптографії, алгебри великих чисел, обробки медіаконтекту та сучасних компіляторів.
Core Libraries
JEP 431: Sequenced Collections. Вводяться три нові типи Collections:
SequencedCollection
SequencedSet
SequencedMap
Та декілька нових методів для Collections.
SequencedCollection. Для забезпечення нових, уніфікованих методів, Java 21 вводить інтерфейс SequencedCollection, який, серед іншого, визначає два методи getFirst()
та getLast()
, представлені вище. Інтерфейс успадковується або реалізується тими інтерфейсами, елементи яких мають фіксовану послідовність:
List (тобто ArrayList, LinkedList)
SortedSet and its extension NavigableSet (TreeSet)
LinkedHashSet
На додаток до наведених вище методів, SequencedCollection також визначає:
void addFirst(E)
void addLast(E)
E removeFirst()
E removeLast()
SequencedSet Interface. Важливо знати, що addFirst(E)
та addLast(E)
мають особливе значення у SequencedSet: якщо елемент, що додається, вже існує, його буде переміщено на початок або кінець набору відповідно.
SequencedMap. SequencedMap пропонує такі методи:
Entry<K, V> firstEntry()
Entry<K, V> lastEntry()
Entry<K, V> pollFirstEntry()
Entry<K, V> pollLastEntry()
V putFirst(K, V)
V putLast(K, V)
SequencedMap<K, V> reversed()
І навіть більше:
SequencedSet sequencedKeySet()
SequencedCollection<V> sequencedValues()
SequencedSet<Entry<K,V>> sequencedEntrySet()
Клас Collections було розширено деякими статичними методами утиліти, зокрема для послідовних колекцій:
newSequencedSetFromMap(SequencedMap map)
unmodifiableSequencedCollection(SequencedCollection c)
Collections.unmodifiableSequencedMap(SequencedMap m)
Collections.unmodifiableSequencedSet(SequencedSet s)
Performance Updates
JEP 439: Generational ZGC. Усім і так уже відомо, що ZGC позиціонується (і є таким насправді) як надшвидкий GC, який робить паузи типу stop the world непомітними для застосунку та обробки даних, запитів чи інших задач. Основна мета ZGC — скоротити паузи до менш ніж як 10 мс, а ідея Generational ZGC навіть більш амбітна — паузи до 1мс.
JEP 452: Key Encapsulation Mechanism API. Надважливий криптографічний функціонал забезпечення безпеки симетричних ключів шифрування. Загалом, будуть впроваджені популярні та стандартизовані алгоритми типу RSA-KEM, ECIES, NIST-кандидат.
Maintenance and Deprecation
JEP 449: Deprecate the Windows
JEP 451: Prepare to Disallow the Dynamic Loading of Agents
Висновки
Java залишається мовою програмування № 1 серед сучасних технологічних трендів. Як показує своєчасне впровадження покращень у Java 20, завдяки постійному ретельному плануванню та залученню екосистеми, платформа Java має всі можливості для сучасного розвитку та зростання у хмарі.
Новий реліз JDK 21 планує стати LTS (Long-Time-Support) версією і мати довгострокову підтримку. Тому зараз дуже добрий і правильний час оновлюватися, друзі!
Стежте за новинами та оновленнями за посиланнями:
- Dev.java (спеціальний портал Oracle для поглиблення ваших знань з Java та участі у комʼюніті).
- Inside.java (суто технічний блог, який ведуть архітектори та інженери, що розроблюють Java).
- Inside.java (подксат про JDK, JVM, GC, core-libs і так далі).
- Inside.java Newscasts (щотижневе ютуб-шоу винятково про Java).
- Java on YouTube (усе про Java та екосистему).
- OpenJDK mailing lists (місце, де можна дізнатися поточний стан речей у OpenJDK-комʼюніті).
- Підписуйтесь на OpenJDK і Java on Twitter.
32 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів