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 не нужно было создавать его заново.
Дальнейшее Чтение
- JEP 350 Динамические архивы компакт-дисков
- cl4cd-диски
- Улучшите Время Запуска На Java 13 С Помощью Класса Приложений – Совместное Использование Данных
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
Дальнейшее Чтение
- Текстовые блоки JEP-355 (Предварительный просмотр)
- Дополнительные многострочные строки, примеры текстовых блоков
Скачать Исходный Код
$клон git $клон git
$компакт-диск java-13
Рекомендации
- Проект OpenJDK 13
- Oracle – Прибытие Java 13!
- cl4cd-диски
- История версий Java
- Выражения переключения Java 13
- Java 13 С Класс приложений – Обмен данными
- Текстовые блоки Java 13
- Что нового в безопасности Java?
- Многострочная строка Java, примеры текстовых блоков
Оригинал: “https://mkyong.com/java/what-is-new-in-java-13/”