Поиск по сайту:

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


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

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

Некоторые из важных функций Java 12:

  1. Изменения JVM — JEP 189, JEP 346, JEP 344 и JEP 230.
  2. Переключение выражений
  3. Метод File mismatch()
  4. Формат компактного числа
  5. Teeing Collectors в Stream API
  6. Новые методы Java Strings — indent(), transform(), descriptionConstable() и resolveConstantDesc().
  7. JEP 334: API констант JVM
  8. JEP 305: сопоставление шаблонов для instanceof
  9. Необработанные строковые литералы удалены из JDK 12.

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

Изменения JVM

1. JEP 189 — Shenandoah: сборщик мусора с малой паузой (экспериментальный)

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

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

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

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

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

4. ИЭП 230 и 344

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

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

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

java -Xshare:off HelloWorld.java

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

Изменения и особенности языка

Java 12 представила множество языковых функций. Давайте рассмотрим несколько с реализациями.

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

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

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

Классический оператор switch:

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);

С новым выражением Switch нам не нужно везде устанавливать 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);

Давайте запустим приведенную ниже программу, содержащую новое выражение Switch, используя 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.

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 скомпилирована и запущена:

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");
    }


}

4. Коллекторы-ти

Teeing Collector — это новая утилита сбора, представленная в Streams API. У этого коллектора три аргумента — два коллектора и бифункция. Все входные значения передаются каждому коллектору, а результат доступен в Bi-функции.

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

В Java 12 были введены 4 новых метода:

  • отступ(int n)
  • преобразование (функция f)
  • Необязательное описаниеConstable()
  • String resolveConstantDesc(MethodHandles.Lookup lookup)

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

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

В этом JEP представлен новый пакет java.lang.constant. Это не так полезно для тех разработчиков, которые не используют пул констант.

7. JEP 305: сопоставление шаблонов для instanceof (предварительная версия)

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

if (obj instanceof String) {
    String s = (String) obj;
    // use s in your code from here
}

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

if (obj instanceof String s) {
    // can use s directly here
} 

Это избавляет нас от некоторого приведения типов, которое было ненужным.

Необработанные строковые литералы удалены из JDK 12.

На этом статья о функциях Java 12 подходит к концу.