JavaRush /Java блог /Random UA /Java 12 вже тут: Що нового?

Java 12 вже тут: Що нового?

Стаття з групи Random UA
Отже, з'явилася Java під номером 12. І нехай це не LTS-реліз (тобто, не Long term support, не той реліз, який довго підтримуватиметься. Першим LTS-релізом з восьмирічним терміном підтримки вважається 11 версія), в ньому з'явабося цікаві оновлення. Розглянемо найважливіші їх. Нагадаємо, у Java пропозиції щодо зміни скорочено називають jep'ами (від JDK Enhancement Proposal). Java 12 вже тут: Що нового?  - 1

Найцікавіші Jep'и JDK 12

189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) У збирачі сміття (Garbage Collector) на ім'я Shenandoah застосовано новий алгоритм, який скорочує час роботи, оскільки займається "чисткою" одночасно із запущеними потоками Java. При цьому час паузи в Shenandoah буде однаковим незалежно від розміру купи (heap). Oracle чомусь не включила Sheandoah до своїх "офіційних" релізних збірок, незважаючи на те, що розробники вважають цю фічу однією з найважливіших у новому релізі. Так що якщо ви плануєте випробувати просунутий Garbage Collector, потрібно використовувати збірки сторонніх компаній, наприклад, Azul . 230: Microbenchmark Suite Microbenchmark це мікротест, який вимірює продуктивність якогось невеликого елемента. У Java їх пишуть і запускають за допомогою фреймворку JMH. Починаючи з 12 версії JMH була додана до JDK, і вже є тести , які написані на ньому, що спрощує життя розробникам. 325: Switch Expressions (Preview) Нова форма написання виразу з оператором switch. На сторінці фічі наводиться приклад коду з традиційним використанням switch, де постійне використання break робить його надмірно багатослівним, що призводить до частих випадкових помилок.
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Автори оновлення пропонують ввести нову форму мітки switch “case L ->” щоб очевидним чином показати, що виконуватиметься тільки код праворуч від мітки, якщо ця мітка – підходяща. Так, код, показаний вище за допомогою нового синтаксису, можна істотно скоротити:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
334: JVM Constants API У пулі констант розташовуються так звані loadable constants. Це значення, наприклад типу String або будь-якого примітивного типу, а також run-time артефакти, такі як класи та методи. Під час роботи з клас-файлуми програмістам не завадабо б зручні інструменти для маніпуляції з loadable constants. Автори цього jep'а почали вирішувати цю проблему за допомогою введення нових value-based типів символічних посилань, при цьому кожна з них описуватиме конкретний вид констант. Код нововведення . 340: One AArch64 Port, Not Two Під цією складною назвою ховається вирішення проблеми, що утворилася ще в Java 9, коли в киті з'явабося 64-бітові ARM-порти Oracle та aarch64 від Red Hat одночасно. При цьому вже під час виходу JDK 11 64-бітну версію портів Oracle не підтримувала навіть сама Oracle. Так що тепер 64-бітові порти Oracle прибрали, залишабося 32-бітові ARM32, і 64-бітові, більш продуктивні, aarch64. 341: Default CDS Archives Дуже приємне оновлення, оскільки воно реально прискорює запуск програм. Не секрет, що при старті Java-програми починає завантаження величезна кількість класів, а це досить тривалий процес. CDS розшифровується як Class Data Sharing, і ця функція дозволяє упаковувати всі ці класи, що запускаються при старті, в спеціальний class data sharing архів, використовуючи дефолтний список цих самих класів. В результаті швидкість запуску додатків суттєво зростає. 344: Abortable Mixed Collections for G1 G1 - це збирач сміття, який став основним у JDK 9, змінивши на цій посаді Parallel GC. У Java 10 G1 навчився збирати сміття у кількох потоках. Однак його роботою були задоволені не всі, однією з головних проблем виявабось тривалі паузи. Тепер їх можна скасувати. G1 на основі аналізу поведінки програми визначає обсяг роботи, а потім збирає "живі" об'єкти в Collection set поки не збере все, не зупиняючись. Часто G1 промахувався з підрахунком обсягу роботи та працював надто довго. Після впровадження jep-344 G1 може перейти на покрокове складання сміття і якщо час виконання наступного кроку виходить за рамки розумного, цей крок можна перервати. 346: Promptly Return Unused Committed Memory from G1 І ще трохи оновлень у стані вищезгаданого збирача G1. Деколи бувало, що купа Java heap memory є, а її, цю пам'ять, ніхто не використовує. Тепер Java 12 можна “повернути” неактивну пам'ять в операційну систему. Раніше домогтися G1 віддати пам'ять можна було дуже рідко, тепер все спростилося. З новою фічею додаток визначається як неактивне, якщо закінчився інтервал з останнього складання і немає concurrent cycle. Інша ситуація - якщо або якщо функція getloadavg(), роботу якої відстежували протягом якогось часу, показує навантаження нижче встановленого допустимого порога. Якщо сталася одна з двох подій, починається часткове складання сміття. Що в Java 12 немає: Raw String Literals Багато розробників з цікавістю поставабося до цієї функції, проте вона так і не з'явилася в даному релізі. Її автори вирішабо, що над нею ще треба попрацювати. Отже, сміємо сподіватися, функція зручної роботи з рядковими літералами з'явиться в одній із найближчих версій Java. Підтримка необроблених рядкових літералів дозволяє працювати з рядковою інформацією незалежно від мови. Це усуває потребу в екрануванні. Особливо корисно в регулярних виразах, де широко використовується зворотний слеш і в Windows-path, де слеш використовується як роздільник. Тобто, щоб уникнути таких конструкцій: C:\My\Test\Pack\
Кожен програміст часто стикається з тими чи іншими труднощами під час роботи. Іноді вони пов'язані з недосвідченістю розробника, але часом з неідеальністю самого інструменту. Java - класна мова, але далеко не ідеальна. Можливо, ви вже зіткнулися з чимось у Java і знаєте, що хотіли б змінити у вашому “інструменті” (мові)? Діліться у коментарях!

Висновки

Жодної революції в Java 12 не відбулося. Проте її ніхто й не планував. Однак низка нововведень спрямована на оптимізацію роботи додатків та прискорення роботи, що не може не тішити. До речі, IDEA вже підтримує JDK 12, так що ви можете випробувати її можливості. Зрозуміло, мало якісь оновлення стосуються новачків безпосередньо, хоча погратися з новим switch (попередньо встановивши прапор --enable-preview) може навіть той, хто тільки почав навчання на JavaRush.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ