Особенности Java 12

Наконец, JDK 12, которая является частью шестимесячного цикла выпуска, здесь. Это происходит после последней версии Java с долгосрочной поддержкой 11. Мы подробно обсудили особенности Java 11 ранее. Сегодня мы будем обсуждать особенности Java 12 и посмотрим, что она приготовила для разработчиков. Java 12 была запущена 19 марта 2019 года. Это не является версией с долгосрочной поддержкой.

Особенности Java 12

Некоторые важные особенности Java 12 включают;

  1. Изменения в JVM – JEP 189, JEP 346, JEP 344 и JEP 230.
  2. Выражения Switch.
  3. Метод mismatch() в классе File.
  4. Компактное форматирование чисел.
  5. Teeing Collectors в API Stream.
  6. Новые методы строк Java – indent(), transform(), describeConstable() и resolveConstantDesc().
  7. JEP 334: API констант JVM.
  8. JEP 305: Паттерн-матчинг для instanceof.
  9. Литералы Raw String были удалены из JDK 12.

Давайте рассмотрим все эти особенности Java 12 одну за другой.

Изменения в JVM

1. JEP 189 – Shenandoah: Низкозадерживающий сборщик мусора (Экспериментальный)

Компания RedHat инициировала сборщик мусора Shenandoah для сокращения времени паузы сборки мусора. Идея заключается в том, чтобы запускать сборку мусора параллельно с выполняющимися потоками Java. Его цель – обеспечить постоянные и предсказуемые короткие паузы, независимо от размера кучи. Поэтому не важно, составляет ли размер кучи 15 МБ или 15 ГБ. Это экспериментальная функция в Java 12.

2. JEP 346 – Быстрое возвращение неиспользуемой выделенной памяти от G1

Начиная с Java 12, G1 теперь будет проверять память кучи Java во время неактивности приложения и возвращать ее в операционную систему. Это превентивная мера для сохранения и использования свободной памяти.

3. JEP 344: Прерываемые смешанные коллекции для G1

Улучшения в эффективности G1 включают сделать сборки смешанных объектов в G1 прерываемыми, если они могут превысить заданную цель паузы. Это достигается путем разделения набора сборки смешанных объектов на обязательные и дополнительные. Таким образом, сборщик G1 может приоритизировать сборку обязательного набора сначала, чтобы достичь цели времени паузы.

4. JEP 230 и 344

Набор микро-тестов, JEP 230 добавляет базовый набор микро-тестов в исходный код JDK. Это позволяет разработчикам легко запускать существующие микро-тесты и создавать новые. Один порт AArch64, а не два, JEP 344, удаляет все исходные файлы, связанные с портом arm64, сохраняя порт ARM 32 бит и порт aarch64 64 бит. Это позволяет участникам сосредоточить свои усилия на одной реализации ARM 64 бит

5. JEP 341 Архивы CDS по умолчанию

Это улучшает процесс сборки JDK для создания архива общих данных класса (CDS) с использованием списка классов по умолчанию на 64-битных платформах. Цель – улучшить время запуска. Начиная с Java 12, CDS включен по умолчанию. Чтобы запустить программу без CDS, выполните следующее:

java -Xshare:off HelloWorld.java

Теперь это может замедлить время запуска программы.

Изменения языка и функции

Java 12 внесла много изменений в язык. Давайте рассмотрим некоторые из них с примерами.

1. Выражения переключения (предварительный просмотр)

Java 12 улучшила выражения переключения для сопоставления с образцом. Введено в JEP 325, как функция предварительного просмотра, новый синтаксис L ->. Вот несколько вещей, которые следует отметить относительно выражений переключения:

  • Новый синтаксис устраняет необходимость в операторе break для предотвращения проваливания.
  • Выражения переключения больше не проваливаются.
  • Кроме того, мы можем определить несколько констант в одной метке.
  • Ключевое слово default теперь обязательно в выражениях переключения.
  • break используется в выражениях переключения для возврата значений из самого случая.

Классическое выражение переключения:

String result = "";
        switch (day) {
            case "M":
            case "W":
            case "F": {
                result = "MWF";
                break;
            }
            case "T":
            case "TH":
            case "S": {
                result = "TTS";
                break;
            }
        };

        System.out.println("Old Switch Result:");
        System.out.println(result);

С новым выражением переключения нам не нужно устанавливать break везде, тем самым предотвращая логические ошибки!

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);

Давайте запустим программу ниже, содержащую новое выражение переключения с использованием JDK 12.

public class SwitchExpressions {

    public static void main(String[] args)
    {
        System.out.println("New Switch Expression result:");
        executeNewSwitchExpression("M");
        executeNewSwitchExpression("TH");
        executeNewSwitchExpression("");
        executeNewSwitchExpression("SUN");
    }

    public static void executeNewSwitchExpression(String day){

        String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);
    }
}

Поскольку это предварительная функция, убедитесь, что вы выбрали уровень языка как предварительный Java 12. Для компиляции вышеуказанного кода выполните следующую команду:

javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java

После запуска скомпилированной программы мы получаем следующее в консоли

Java Switch Expressions Program Output

Выражения Switch – это предварительная функция языка. Это означает, что даже если она завершена, она может не быть подтверждена в будущем выпуске Java.

2. Метод сравнения File.mismatch

Java 12 добавил следующий метод для сравнения двух файлов:

public static long mismatch(Path path, Path path2) throws IOException

Этот метод возвращает позицию первого несоответствия или -1L, если несоответствия нет. Два файла могут иметь несоответствие в следующих сценариях:

  • Если байты не идентичны. В этом случае возвращается позиция первого несовпадающего байта.
  • Размеры файлов не идентичны. В этом случае возвращается размер меньшего файла.

Приведен фрагмент кода из IntelliJ Idea ниже:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileMismatchExample {

    public static void main(String[] args) throws IOException {
        Path filePath1 = Files.createTempFile("file1", ".txt");
        Path filePath2 = Files.createTempFile("file2", ".txt");
        Files.writeString(filePath1,"JournalDev Test String");
        Files.writeString(filePath2,"JournalDev Test String");

        long mismatch = Files.mismatch(filePath1, filePath2);

        System.out.println("File Mismatch position... It returns -1 if there is no mismatch");

        System.out.println("Mismatch position in file1 and file2 is >>>>");
        System.out.println(mismatch);

        filePath1.toFile().deleteOnExit();
        filePath2.toFile().deleteOnExit();

        System.out.println();

        Path filePath3 = Files.createTempFile("file3", ".txt");
        Path filePath4 = Files.createTempFile("file4", ".txt");
        Files.writeString(filePath3,"JournalDev Test String");
        Files.writeString(filePath4,"JournalDev.com Test String");

        long mismatch2 = Files.mismatch(filePath3, filePath4);

        System.out.println("Mismatch position in file3 and file4 is >>>>");
        System.out.println(mismatch2);

        filePath3.toFile().deleteOnExit();
        filePath4.toFile().deleteOnExit();



    }

}

Вывод при компиляции и запуске вышеуказанной программы на Java:

Java File Mismatch Example Program Output

3. Компактное форматирование чисел

import java.text.NumberFormat;
import java.util.Locale;

public class CompactNumberFormatting {


    public static void main(String[] args)
    {
        System.out.println("Compact Formatting is:");
        NumberFormat upvotes = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
        upvotes.setMaximumFractionDigits(1);

        System.out.println(upvotes.format(2592) + " upvotes");


        NumberFormat upvotes2 = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
        upvotes2.setMaximumFractionDigits(2);
        System.out.println(upvotes2.format(2011) + " upvotes");
    }


}
Java Compact Number Formatting Program Output

4. Коллекторы Teeing

Коллектор Teeing – это новая утилита коллектора, введенная в API потоков. У этого коллектора три аргумента – два коллектора и двухфункциональный объект. Все входные значения передаются каждому коллектору, и результат доступен в двухфункциональном объекте.

double mean = Stream.of(1, 2, 3, 4, 5)
                .collect(Collectors.teeing(
                        summingDouble(i -> i),
                        counting(),
                        (sum, n) -> sum / n));

System.out.println(mean);

Выходное значение – 3.0.

5. Новые методы Java Strings

Было введено 4 новых метода в Java 12, которые следующие:

  • indent(int n)
  • transform(Function f)
  • Optional describeConstable()
  • String resolveConstantDesc​(MethodHandles.Lookup lookup)

Чтобы узнать подробности о вышеуказанных методах и их реализации, обратитесь к нашему руководству Методы строки Java 12.

6. JEP 334: API констант JVM

A new package java.lang.constant is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.

7. JEP 305: Сопоставление образцов для instanceof (Предварительный просмотр)

Еще одна предварительная функция языка! Старый способ приведения типа к другому типу:

if (obj instanceof String) {
    String s = (String) obj;
    // используйте s в вашем коде отсюда
}

Новый способ:

if (obj instanceof String s) {
    // можно использовать s прямо здесь
} 

Это позволяет нам избежать лишнего приведения типов.

Литералы сырых строк удалены из JDK 12.

Это завершает статью о функциях Java 12.

Source:
https://www.digitalocean.com/community/tutorials/java-12-features