Итак, появилась 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.