Рубрики
Без рубрики

Что нового в Java 13

Функции Java 13 – Переключение выражений, многострочные текстовые блоки, отказ от устаревшего API сокетов и т. Д.

Java 13 стала общедоступной 17 сентября 2019 года, скачать Java 13 можно здесь или это Архив OpenJDK .

Функции Java 13.

  • 1. JEP 350 Динамические архивы компакт-дисков
  • 2. JPG 351 ZGC: нефиксированный Неиспользуемая Память
  • 3. JEP-353 Переопределяет устаревший API сокетов
  • 4. Выражения переключения JEP-354 (Предварительный просмотр)
  • 5. Текстовые блоки JEP-355 (Предварительный просмотр)

Функции разработчика Java 13.

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

1. JEP 350 Динамические архивы компакт-дисков

Java 10 представила Класс приложений JEP 310 – Совместное использование данных . Этот JEP упрощает процесс создания архивов компакт-дисков.

Эта команда создает файл архива компакт-дисков .jar .

$ java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello

Эта команда запускает файл .jar с существующим архивом компакт-дисков.

$  bin/java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello

Совместное использование данных классов (CDS) повышает производительность при запуске, создавая архив данных классов один раз и повторно используя его, чтобы JVM не нужно было создавать его заново.

Дальнейшее Чтение

2. JPG 351 ZGC: нефиксированный Неиспользуемая Память

Java 11 представила JEP 333: Z Сборщик мусора (экспериментальный) ; он обеспечивает короткие паузы при очистке памяти кучи. Однако он не возвращал неиспользуемую память кучи в операционную систему, даже если она не использовалась в течение длительного времени.

Этот JEP улучшил ZGC, вернув операционной системе неиспользуемую память кучи.

Дальнейшее Чтение

3. JEP-353 Переопределяет устаревший API сокетов

Основные реализации java.net . Гнездо и java.net . ServerSocket являются древними, восходящими к JDK 1.0, сочетанию устаревшего кода Java и C, который трудно поддерживать и отлаживать. В этом JEEP представлены новые базовые реализации API-интерфейсов сокетов, которые являются реализацией по умолчанию в Java 13.

До Java 13 он использует PlainSocketImpl для SocketImpl

public class ServerSocket implements java.io.Closeable {

    /**
     * The implementation of this Socket.
     */
    private SocketImpl impl;

}

Java 13 представила новый Nio сокет Impl класс в качестве замены для PlainSocketImpl . Однако, если что-то пойдет не так, мы все равно сможем вернуться к старой реализации PlainSocketImpl установив jdk.net.используйте системное свойство PlainSocketImpl .

Рассмотрим простой пример сокета.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class JEP353 {

    public static void main(String[] args) {

        try (ServerSocket serverSocket = new ServerSocket(8888)){

            boolean running = true;
            while(running){

                Socket clientSocket = serverSocket.accept();
                //do something with clientSocket
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

В Java 13 реализацией по умолчанию является Nio Socket Impl

D:\test>javac JEP353.java

D:\test>java JEP353

D:\test>java -XX:+TraceClassLoading JEP353  | findStr Socket

[0.040s][info   ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.040s][info   ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.040s][info   ][class,load] java.net.ServerSocket$1 source: jrt:/java.base
[0.040s][info   ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.040s][info   ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.044s][info   ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800ba0840 source: java.net.SocketImpl
[0.047s][info   ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base

[0.047s][info   ][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base

[0.047s][info   ][class,load] sun.nio.ch.SocketDispatcher source: jrt:/java.base
[0.052s][info   ][class,load] java.net.SocketAddress source: jrt:/java.base
[0.052s][info   ][class,load] java.net.InetSocketAddress source: jrt:/java.base
[0.052s][info   ][class,load] java.net.InetSocketAddress$InetSocketAddressHolder source: jrt:/java.base
[0.053s][info   ][class,load] sun.net.ext.ExtendedSocketOptions source: jrt:/java.base
[0.053s][info   ][class,load] jdk.net.ExtendedSocketOptions source: jrt:/jdk.net
[0.053s][info   ][class,load] java.net.SocketOption source: jrt:/java.base
[0.053s][info   ][class,load] jdk.net.ExtendedSocketOptions$ExtSocketOption source: jrt:/jdk.net
[0.053s][info   ][class,load] jdk.net.SocketFlow source: jrt:/jdk.net
[0.053s][info   ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions source: jrt:/jdk.net
[0.053s][info   ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions$1 source: jrt:/jdk.net
[0.054s][info   ][class,load] jdk.net.ExtendedSocketOptions$1 source: jrt:/jdk.net
[0.054s][info   ][class,load] sun.nio.ch.NioSocketImpl$FileDescriptorCloser source: jrt:/java.base
[0.055s][info   ][class,load] java.net.Socket source: jrt:/java.base

Мы можем переключиться обратно на PlainSocketImpl установив Djdk.net.использовать системное свойство PlainSocketImpl .

D:\test>java -Djdk.net.usePlainSocketImpl -XX:+TraceClassLoading JEP353  | findStr Socket

[0.041s][info   ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.041s][info   ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.041s][info   ][class,load] java.net.ServerSocket$1 source: jrt:/java.base
[0.041s][info   ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.041s][info   ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.045s][info   ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800ba0840 source: java.net.SocketImpl
[0.048s][info   ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.048s][info   ][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base

[0.048s][info   ][class,load] java.net.PlainSocketImpl source: jrt:/java.base

[0.048s][info   ][class,load] java.net.AbstractPlainSocketImpl$1 source: jrt:/java.base
[0.050s][info   ][class,load] sun.net.ext.ExtendedSocketOptions source: jrt:/java.base
[0.050s][info   ][class,load] jdk.net.ExtendedSocketOptions source: jrt:/jdk.net
[0.050s][info   ][class,load] java.net.SocketOption source: jrt:/java.base
[0.051s][info   ][class,load] jdk.net.ExtendedSocketOptions$ExtSocketOption source: jrt:/jdk.net
[0.051s][info   ][class,load] jdk.net.SocketFlow source: jrt:/jdk.net
[0.051s][info   ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions source: jrt:/jdk.net
[0.051s][info   ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions$1 source: jrt:/jdk.net
[0.051s][info   ][class,load] jdk.net.ExtendedSocketOptions$1 source: jrt:/jdk.net
[0.051s][info   ][class,load] java.net.StandardSocketOptions source: jrt:/java.base
[0.051s][info   ][class,load] java.net.StandardSocketOptions$StdSocketOption source: jrt:/java.base
[0.053s][info   ][class,load] sun.net.ext.ExtendedSocketOptions$$Lambda$2/0x0000000800ba1040 source: sun.net.ext.ExtendedSocketOptions
[0.056s][info   ][class,load] java.net.SocketAddress source: jrt:/java.base
[0.056s][info   ][class,load] java.net.InetSocketAddress source: jrt:/java.base
[0.058s][info   ][class,load] java.net.InetSocketAddress$InetSocketAddressHolder source: jrt:/java.base
[0.059s][info   ][class,load] java.net.SocketCleanable source: jrt:/java.base

P.S Java 15 JEP 373: Переопределите устаревший API DatagramSocket , заменить базовые реализации java.net . Хранилище данных и java.net . Многоадресный пакет .

Дальнейшее Чтение

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

Java 12 представила Выражения переключения JEP 325 . Этот JEP отбросил значение break в пользу ключевого слова yield , чтобы вернуть значение из выражений switch .

P.S Это функция языка предварительного просмотра в Java 13

Традиционный оператор switch , мы можем возвращать значение, подобное этому:

  private static String getNumber(int number) {
        String result = "";
        switch (number) {
            case 1:
            case 2:
                result = "one or two";
                break;
            case 3:
                result = "three";
                break;
            case 4:
            case 5:
            case 6:
                result = "four or five or six";
                break;
            default:
                result = "unknown";
        }
        ;
        return result;
    }

В Java 12 мы можем использовать break для возврата значения из переключателя .

  private static String getNumberViaBreak(int number) {
      String result = switch (number) {
          case 1, 2:
              break "one or two";
          case 3:
              break "three";
          case 4, 5, 6:
              break "four or five or six";
          default:
              break "unknown";
      };
      return result;
  }

В Java 13 приведенное выше значение Java 12 разрыв значения отбрасывается в пользу ключевого слова yield для возврата значения.

  private static String getNumberViaYield(int number) {
      return switch (number) {
          case 1, 2:
              yield "one or two";
          case 3:
              yield "three";
          case 4, 5, 6:
              yield "four or five or six";
          default:
              yield "unknown";
      };
  }

или вот так

  private static String getNumberViaYield2(int number) {
      return switch (number) {
          case 1, 2:
              yield "one or two";
          case 3:
              yield "three";
          case 4, 5, 6:
              int i = 0;
              i++;
              yield "four or five or six : " + i;
          default:
              yield "unknown";
      };
    }

Метки правил или стрелки или регистр L все еще поддерживаются в Java 13.

  private static String getNumberViaCaseL(int number) {
      return switch (number) {
          case 1, 2 -> "one or two";
          case 3 -> "three";
          case 4, 5, 6 -> "four or five or six";
          default -> "unknown";
      };
  }

Или вот так, смешал использование синтаксиса стрелки и выход .

  private static String getNumberViaCaseL2(int number) {
      return switch (number) {
          case 1, 2 -> "one or two";
          case 3 -> "three";
          case 4, 5, 6 -> {
              int i = 0;
              i++;
              yield "four or five or six :" + 1;
          }
          default -> "unknown";
      };
  }

P.S Это выражение переключателя становится стандартной функцией в Java 14 JEP 361 .

Дальнейшее Чтение

5. Текстовые блоки JEP-355 (Предварительный просмотр)

Этот ДЖИП вводит многострочный строковый литерал, текстовый блок, наконец.

P.S Эти текстовые блоки являются постоянной функцией в Java 15.

До Java 13

 String html ="\n" +
			  "   \n" +
			  "      

Hello, World

\n" + " \n" + "\n"; String json ="{\n" + " \"name\":\"mkyong\",\n" + " \"age\":38\n" + "}\n";

Сейчас Ява 13

 String html =  """
                
                    
                        

Hello, World

"""; String json = """ { "name":"mkyong", "age":38 } """;

Примечание Этот текстовый блок имеет второй предварительный просмотр в Java 14 – JEP 368 , добавлены еще две новые escape-последовательности:

  • \<конец строки> подавляет завершение строки.
  • \s переводится в один пробел.

Чтобы включить функции предварительного просмотра Java 13:

javac --enable-preview --release 13 Example.java
java --enable-preview Example

Дальнейшее Чтение

Скачать Исходный Код

$клон git $клон git

$компакт-диск java-13

Рекомендации

Оригинал: “https://mkyong.com/java/what-is-new-in-java-13/”