В Java 13 не так много крупных обновлений, которые обычно называют JEP (Java Enhancement Proposal). Вот список JEP, которые были поставлены в новой версии Java:

  • Переключение выражений (предварительная версия)
  • Текстовые блоки (предварительная версия)
  • Повторно реализовать устаревший API сокетов
  • Динамические архивы CDS
  • ZGC: отменить неиспользуемую память

Скорее всего, первые два обновления будут наиболее интересны большинству Java-разработчиков, так как они вводят новый синтаксис в язык Java.

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

Выражения переключения уже были представлены в Java 12. Короче говоря, JEP 325 добавил новую упрощенную форму switch, которая выглядит следующим образом:

T result = switch (arg) {
    case L1 -> e1;
    case L2 -> e2;
    default -> e3;
};

Если вы не знакомы с новым синтаксисом, вот пример:

int result = switch (s) {
    case "Foo" -> 1;
    case "Bar" -> 2;
    default    -> throw new IllegalArgumentException("Oops!");
};

В Java 13 добавлено новое ключевое слово yield a, которое позволяет возвращать значение из блока switch:

int result = switch (s) {
    case "Foo" -> 1;
    case "Bar" -> 2;
    default    -> {
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
    }
};

Здесь мы видим, что выражение switch можно использовать для вычисления значения локальной переменной без присвоения значения в каждом case блоке. Оператор yield the используется в блоке default для возврата значения, но его можно использовать и в обычном блоке case.

Теперь плохие новости. Возможно, вы заметили слово «предварительный просмотр» в названии JEP. Это означает, что новый синтаксис не включен по умолчанию в Java 13. Если вы хотите поиграть с новыми выражениями switch, вам нужно запустить компилятор Java с параметрами --enable-preview --release 13, а затем запустить программу с параметром --enable-preview:

$ javac -d classes --enable-preview --release 13 Test.java
$ java -classpath classes --enable-preview Test

Текстовые блоки (предварительная версия)

В Java 13 есть еще одно обновление языка. Именно текстовые блоки помогают определять многострочные строки. Например, фрагмент HTML или запрос SQL часто определяются как многострочная строка в Java. Вот как это обычно выглядит:

String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

Возможно, вы заметили много символов \n, + и ", которые делают код немного длиннее и сложнее для чтения. Некоторые языки программирования, такие как Python, позволяют определять многострочные строки, используя тройные кавычки """ для их начала и конца. Такая языковая функция может помочь сделать код намного лучше. Наконец, в Java 13 появилась такая возможность. Вот как приведенный выше пример можно переписать, используя новые текстовые блоки:

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

Во время выполнения приведенная выше строка становится обычным String (обратите внимание, что пробелы отступа удаляются во время выполнения):

<html>
    <body>
        <p>Hello, world</p>
    </body>
</html>

Хотя новые текстовые блоки могут выглядеть простыми, вокруг них довольно много важных тем, таких как разделители строк, отступы, случайные пробелы, escape-последовательности, конкатенация. Вы можете найти все детали в JEP 355.

Изучайте java 13 с обновлениями angular 8 от Обучение Angular в Ченнаи

Остальные

JEP 353 заменяет базовую реализацию API java.net.Socket и java.net.ServerSocket. Основная мотивация этого обновления заключалась в том, что старая реализация имеет ряд проблем и плохо вписывается в планы дальнейшего развития Java.

Сокеты Java являются основным компонентом для работы в сети. Если обновление приведет к регрессии, оно затронет многие приложения. К счастью, старую реализацию не удалили. Если что-то пойдет не так, системное свойство jdk.net.usePlainSocketImpl можно использовать для возврата к старым реализациям. Однако старая реализация и системное свойство будут удалены в одном из следующих выпусков JDK.

Далее JEP 351 представляет новую опцию-XX:ZUncommitDelay для сборщика мусора Z (ZGC). Параметр сообщает ZGC, когда он должен отменить фиксацию и вернуть память операционной системе.

Наконец, JEP 350 — это обновление для совместного использования данных классов приложений (AppCDS). JEP — совместное использование данных класса приложения, позволяющее динамически архивировать классы в конце выполнения приложения Java.

Вывод

В Java 13 не так уж много JEP. Помимо основных обновлений, новый выпуск Java содержит около 2500 исправлений ошибок и незначительных улучшений. Поскольку новые текстовые блоки и switch выражений все еще являются предварительными функциями языка, скорее всего, мы не увидим большой разницы после перехода на новую версию Java.