{"id":23650,"date":"2021-11-08T14:45:00","date_gmt":"2021-11-08T13:45:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=23650"},"modified":"2024-11-27T15:08:14","modified_gmt":"2024-11-27T14:08:14","slug":"java-13-features","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/java-13-features\/","title":{"rendered":"Java 13 Features (mit Beispielen)"},"content":{"rendered":"\n<p>Java 13 wurde am 17.09.2019 ver\u00f6ffentlicht.<\/p>\n\n\n\n<p>Die \u00c4nderungen in Java 13 sind recht \u00fcberschaubar. Insgesamt haben es nur f\u00fcnf JDK Enhancement Proposals (JEPs) in das Release geschafft \u2013 und davon sind drei als experimentelle bzw. Preview-Features eingestuft.<\/p>\n\n\n\n<p>Der Artikel beginnt mit den experimentellen und Preview-Features, da diese die spannendsten \u00c4nderungen in Java 13 darstellen.<\/p>\n\n\n\n<p>Es folgen Performance-Verbesserungen, Erweiterungen der JDK-Klassenbibliothek und sonstige \u00c4nderungen, mit denen wir in unserer t\u00e4glichen Entwicklerarbeit eher selten in Ber\u00fchrung kommen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"experimentelle-und-preview-features\">Experimentelle und Preview-Features<\/h2>\n\n\n\n<p>Auf die experimentellen und Preview-Features werde ich an dieser Stelle nicht in der vollen Tiefe eingehen. Eine ausf\u00fchrliche Beschreibung folgt in denjenigen Teilen der Serie, in denen diese Features Produktionsreife erlangen werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"switch-expressions-second-preview\">Switch Expressions (Second Preview)<\/h3>\n\n\n\n<p>Mit dem <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/325\" target=\"_blank\">JEP 325<\/a> wurden in <a href=\"\/de\/java\/java-12-features\/#Switch_Expressions_Preview\">Java 12 Switch Expressions als Preview<\/a> eingef\u00fchrt. <code>switch<\/code> kann seither als Anweisung oder als Ausdruck eingesetzt werden. \"Ausdruck\" bedeutet, dass <code>switch<\/code> einen Wert zur\u00fcckgibt, wie z. B. in folgendem Beispiel aus dem JEP:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">int<\/span> numLetters = <span class=\"hljs-keyword\">switch<\/span> (day) {\n  <span class=\"hljs-keyword\">case<\/span> MONDAY, FRIDAY, SUNDAY:\n    <span class=\"hljs-keyword\">break<\/span> <span class=\"hljs-number\">6<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> TUESDAY:\n    <span class=\"hljs-keyword\">break<\/span> <span class=\"hljs-number\">7<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> THURSDAY, SATURDAY:\n    <span class=\"hljs-keyword\">break<\/span> <span class=\"hljs-number\">8<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> WEDNESDAY:\n    <span class=\"hljs-keyword\">break<\/span> <span class=\"hljs-number\">9<\/span>;\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Auf Grundlage von Feedback aus der Entwickler-Community wird mit dem <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/354\" target=\"_blank\">JDK Enhancement Proposal 354<\/a> in Switch-Ausdr\u00fccken das <code>break<\/code>-Keyword durch das neue Keyword <code>yield<\/code> ersetzt: <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">int<\/span> numLetters = <span class=\"hljs-keyword\">switch<\/span> (day) {\n  <span class=\"hljs-keyword\">case<\/span> MONDAY, FRIDAY, SUNDAY:\n    yield <span class=\"hljs-number\">6<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> TUESDAY:\n    yield <span class=\"hljs-number\">7<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> THURSDAY, SATURDAY:\n    yield <span class=\"hljs-number\">8<\/span>;\n  <span class=\"hljs-keyword\">case<\/span> WEDNESDAY:\n    yield <span class=\"hljs-number\">9<\/span>;\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das neue Keyword ist nur im Scope eines Switch-Ausdrucks bekannt. Solltest du also in deinem Quellcode <code>yield<\/code> anderweitig verwenden, gibt es h\u00f6chstwahrscheinlich keinen Anlass deinen Quellcode anzupassen.<\/p>\n\n\n\n<p>Switch Expressions werden im n\u00e4chsten Release, <a href=\"\/de\/java\/java-14-features\/\">Java 14<\/a>, Produktionsstatus erreichen. Alle Details \u00fcber sie findest du im <a href=\"\/de\/java\/switch-expressions\/\">Hauptartikel \u00fcber Switch Expressions<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"text-blocks-preview\">Text Blocks (Preview)<\/h3>\n\n\n\n<p>Um einen mehrzeiligen String zu definieren, mussten wir bisher Escape-Sequenzen f\u00fcr Zeilenumbr\u00fcche und im String enthaltene Anf\u00fchrungszeichen einsetzen. Ein SQL-Statement sah beispielsweise so aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String sql =\n    <span class=\"hljs-string\">\"SELECT id, firstName, lastName FROM Employee\\n\"<\/span>\n        + <span class=\"hljs-string\">\"WHERE departmentId = \\\"IT\\\"\\n\"<\/span>\n        + <span class=\"hljs-string\">\"ORDER BY lastName, firstName\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/355\" target=\"_blank\">JDK Enhancement Proposal 355<\/a> erm\u00f6glicht es solch einen String deutlich lesbarer zu notieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">String sql = <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    SELECT id, firstName, lastName FROM Employee\n    WHERE departmentId = \"<\/span>IT<span class=\"hljs-string\">\"\n    ORDER BY lastName, firstName\"<\/span><span class=\"hljs-string\">\"\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Textbl\u00f6cke werden in <a href=\"\/de\/java\/java-15-features\/\">Java 15<\/a> Produktionsreife erlangen. Eine Vorstellung in allen Details findest du im <a href=\"\/de\/java\/java-text-blocks\/\">Hauptartikel \u00fcber Textbl\u00f6cke<\/a>.<\/p>\n\n\n\n<p>Um Text Blocks in Java 13 einzusetzen, musst du sie entweder in deiner IDE aktivieren (in IntelliJ \u00fcber <em>File\u2192Project Structure\u2192Project Settings\u2192Project\u2192Project language level<\/em>) oder mit dem Parameter <code>--enable-preview<\/code> beim Aufruf der <code>javac<\/code>- und <code>java<\/code>-Kommandos.<\/p>\n\n\n\n<p>Text Blocks ersetzt den zur\u00fcckgezogenen <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/326\" target=\"_blank\">JEP 326<\/a>, \"Raw String Literals\", der von der Community nicht akzeptiert wurde. Falls du Interesse an den Gr\u00fcnden hast, du findest sie in der <a rel=\"noopener\" href=\"https:\/\/mail.openjdk.org:443\/pipermail\/jdk-dev\/2018-December\/002402.html\">jdk-dev-Mailingliste<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zgc-uncommit-unused-memory-experimental\">ZGC: Uncommit Unused Memory (Experimental)<\/h3>\n\n\n\n<p>ZGC ist ein <a href=\"\/de\/java\/java-11-features\/#ZGC_A_Scalable_Low-Latency_Garbage_Collector_Experimental\">in Java 11 experimentell eingef\u00fchrter Garbage Collector<\/a>, der extrem kurze Stop-The-World-Pausen von maximal 10 ms verspricht.<\/p>\n\n\n\n<p>Mit <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/351\" target=\"_blank\">JDK Enhancement Proposal 351<\/a> wurde ZGC dahingehend erweitert, dass er ungenutzten Heap-Speicher nach einer bestimmten Zeit an das Betriebssystem zur\u00fcckgibt.<\/p>\n\n\n\n<p>Mit <code>-XX:ZUncommitDelay<\/code> kannst du die Zeit in Sekunden angeben, nach der ungenutzter Speicher zur\u00fcckgegeben wird. Per default ist dieser Wert auf 300 Sekunden eingestellt.<\/p>\n\n\n\n<p>Das Feature ist standardm\u00e4\u00dfig aktiviert und kann mit <code>-XX:-ZUncommit<\/code> deaktiviert werden.<\/p>\n\n\n\n<p>ZGC wird in <a href=\"\/de\/java\/java-15-features\/#ZGC_A_Scalable_Low-Latency_Garbage_Collector\">Java 15<\/a> Produktionsstatus erreichen. Im entsprechenden Artikel werde ich den neuen Garbage Collector genauer vorstellen.<\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"1427197203\" src=\"https:\/\/happycoders.kit.com\/1427197203\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"performance-verbesserungen\">Performance-Verbesserungen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"dynamic-cds-archives\">Dynamic CDS Archives<\/h3>\n\n\n\n<p>In <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-10-features\/#Application_Class-Data_Sharing\">Java 10 wurde Application Class Data Sharing<\/a> eingef\u00fchrt \u2013 ein Feature, das es erm\u00f6glicht, eine sogenannte Shared-Archive-Datei zu erstellen. Diese Datei enth\u00e4lt die Klassen der Anwendung in einer bin\u00e4ren Form, wie sie die JVM der verwendeten Plattform ben\u00f6tigt. Die Datei wird per Memory-Mapped I\/O in den Arbeitsspeicher der JVM gemappt.<\/p>\n\n\n\n<p>Bisher war es relativ aufw\u00e4ndig diese Datei zu erstellen. So musste zun\u00e4chst w\u00e4hrend eines Probelaufs der Anwendung eine Klassenliste erstellt werden. Erst in einem zweiten Schritt wurde aus dieser Liste dann das Shared Archive generiert.<\/p>\n\n\n\n<p>Die folgenden Beispiel-Aufrufe sind dem oben verlinkten Artikel entnommen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">java -Xshare:off -XX:+UseAppCDS \\\n    -XX:DumpLoadedClassList=helloworld.lst \\\n    -cp target\/helloworld.jar eu.happycoders.appcds.Main\n\njava -Xshare:dump -XX:+UseAppCDS \\\n    -XX:SharedClassListFile=helloworld.lst \\\n    -XX:SharedArchiveFile=helloworld.jsa \\\n    -cp target\/helloworld.jar<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit dem <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/350\" target=\"_blank\">JDK Enhancement Proposal 350<\/a> wird dieser Prozess vereinfacht. Das Shared Archive kann ab Java 13 \u00fcber den Paramter <code>-XX:ArchiveClassesAtExit<\/code> im Anschluss an die Ausf\u00fchrung der Anwendung generiert werden. Die zus\u00e4tzlichen Parameter <code>-Xshare:on<\/code> und <code>-XX:+UseAppCDS<\/code> werden nicht mehr ben\u00f6tigt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">java -XX:ArchiveClassesAtExit=helloworld.jsa \\\n    -cp target\/helloworld.jar eu.happycoders.appcds.Main<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das erstellte Shared Archive ist deutlich kleiner als zuvor (256 KB statt 9 MB). Es enth\u00e4lt nur noch die Klassen der Applikation. Die JDK-Klassen werden aus dem mit dem JDK ausgelieferten Basis-Archiv <code>classes.jsa<\/code> geladen.<\/p>\n\n\n\n<p>Verwendet wird das Shared Archive ab Java 13 wie folgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">java -XX:SharedArchiveFile=helloworld.jsa \\\n    -cp target\/helloworld.jar eu.happycoders.appcds.Main<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In dem zu Beginn des Abschnitts verlinkten Artikel findest du ein Beispiel f\u00fcr den Einsatz von AppCDS mit einer Schritt-f\u00fcr-Schritt-Anleitung. Versuch doch einmal das Beispiel nachzustellen und dabei statt der bisherigen zwei Schritte die neue Option <code>-XX:ArchiveClassesAtExit<\/code> einzusetzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"soft-max-heap-size\">Soft Max Heap Size<\/h3>\n\n\n\n<p>Mit dem neuen Kommandozeilen-Parameter <code>-XX:SoftMaxHeapSize<\/code> kann man eine \"weiche\" Obergrenze f\u00fcr die Heap-Gr\u00f6\u00dfe festlegen. Der Garbage Collector wird dann versuchen den Heap unter dieser Grenze zu halten und sie nur dann zu \u00fcberschreiten, wenn es erforderlich ist, um einen <code>OutOfMemoryError<\/code> zu vermeiden.<\/p>\n\n\n\n<p>Einsatzszenario sind Umgebungen, in denen f\u00fcr die tats\u00e4chliche RAM-Nutzung bezahlt wird. So kann der Heap grunds\u00e4tzlich klein gehalten werden, bei erh\u00f6hten Platzbedarf aber vor\u00fcbergehend \u00fcber die weiche Obergrenze hinaus wachsen.<\/p>\n\n\n\n<p>Aktuell unters\u00fctzt dieses Feature nur der (noch experimentelle) ZGC.<\/p>\n\n\n\n<p><em>(Zu dieser Erweiterung gibt es kein JDK Enhancement Proposal.)<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"erweiterungen-der-jdk-klassenbibliothek\">Erweiterungen der JDK-Klassenbibliothek<\/h2>\n\n\n\n<p>Es wurden mehrere Methoden zur Klasse <code>ByteBuffer<\/code> hinzugef\u00fcgt, mit der Lese-\/Schreiboperationen an vorgegebenen Buffer-Positionen m\u00f6glich sind, anstatt \u2013 wie bisher \u00fcblich \u2013 an der durch den <code>ByteBuffer<\/code> selbst verwalteten Position.<\/p>\n\n\n\n<p>Falls du eine Auffrischung zum Thema <code>ByteBuffer<\/code> ben\u00f6tigst, empfehle ich dir <a href=\"https:\/\/www.happycoders.eu\/de\/java\/bytebuffer-flip-compact\/\">diesen ByteBuffer-Grundlagenartikel<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"bytebuffer-slice\">ByteBuffer.slice()<\/h3>\n\n\n\n<p>Mit <code>ByteBuffer.slice()<\/code> kannst du eine View auf einen Teil des Puffers erzeugen. Diese bereits vor Java 13 existierende Methode liefert eine View, die an der aktuellen Position des Puffers beginnt und deren Kapazit\u00e4t und Limit den verbleibenden Bytes des Puffers entsprechen.<\/p>\n\n\n\n<p>Neu ist die Methode <code>ByteBuffer.slice(int index, int length)<\/code>. Mit dieser kannst du eine View erstellen, die an Position <code>index<\/code> beginnt und <code>length<\/code> Bytes enth\u00e4lt. Die neue Methode ignoriert somit Position, Kapazit\u00e4t und Limit des zugrunde liegenden Puffers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"neue-bytebuffer-get-und-put-methoden\">Neue <code>ByteBuffer.get()<\/code>- und <code>put()<\/code>-Methoden  <\/h3>\n\n\n\n<p>Analog gibt es jeweils zwei neue <code>get()<\/code>- und <code>put()<\/code>-Methoden, mit der die Daten nicht \u2013 wie bisher \u2013 an der aktuellen Position des Puffers gelesen\/geschrieben werden, sondern an der explizit angegeben Position:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>get\u200b(int index, byte[] dst, int offset, int length)<\/code> \u2013 \u00fcbertr\u00e4gt <code>length<\/code> Bytes ab der durch <code>index<\/code> angegebenen Position des Puffers in das Byte-Array <code>dst<\/code> ab Position <code>offset<\/code>.<\/li>\n\n\n\n<li><code>get\u200b(int index, byte[] dst)<\/code> \u2013 \u00fcbertr\u00e4gt Daten ab der durch <code>index<\/code> angegebenen Position des Puffers in das Byte-Array <code>dst<\/code>. Die Anzahl der \u00fcbertragenen Bytes entspricht der L\u00e4nge des Ziel-Arrays.<\/li>\n\n\n\n<li><code>put\u200b(int index, byte[] src, int offset, int length)<\/code> \u2013 \u00fcbertr\u00e4gt <code>length<\/code> Bytes aus dem Byte-Array <code>src<\/code> ab Position <code>offset<\/code> in den Puffer ab Position <code>index<\/code>.<\/li>\n\n\n\n<li><code>put\u200b(int index, byte[] src)<\/code> \u2013 \u00fcbertr\u00e4gt alle Bytes aus dem Byte-Array <code>src<\/code> in den Puffer ab Position <code>index<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Die Position des Puffers bleibt bei allen vier Methoden unver\u00e4ndert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"filesystems-newfilesystem\">FileSystems.newFileSystem()<\/h3>\n\n\n\n<p>Mit der Methode <code>FileSystems.newFileSystem(Path path, ClassLoader loader)<\/code> kannst du ein Pseudo-Dateisystem erstellen, dessen Inhalt auf eine Datei (wie z. B. eine ZIP- oder JAR-Datei) gemappt wird.<\/p>\n\n\n\n<p>Die Methode wurde in Java 13 mit einer Variante \u00fcberladen, die es erm\u00f6glicht eine anbieterspezifischen Konfiguration des Dateisystems mit zu \u00fcbergeben: <code>FileSystems.newFileSystem\u200b(Path path, Map env, ClassLoader loader)<\/code><\/p>\n\n\n\n<p>Weiterhin wurden zwei Varianten jeweils ohne den <code>loader<\/code>-Parameter hinzugef\u00fcgt. Ein Class Loader wird nur dann ben\u00f6tigt, wenn der sogenannte <code>FileSystemProvider<\/code> f\u00fcr den zu mappenden Dateityp nicht im JDK registriert ist, sondern \u00fcber den angegebenen Class Loader geladen werden soll. F\u00fcr g\u00e4ngige Dateitypen wie ZIP oder JAR ist das nicht erforderlich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"sonstige-aenderungen-in-java-13-die-man-als-java-entwickler-nicht-unbedingt-kennen-muss\">Sonstige \u00c4nderungen in Java 13 (die man als Java-Entwickler nicht unbedingt kennen muss)<\/h2>\n\n\n\n<p>Dieser Abschnitt listet \u00c4nderungen auf, mit denen eher wenige Java-Entwicklerinnen und -Entwickler in Ber\u00fchrung kommen werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"reimplement-the-legacy-socket-api\">Reimplement the Legacy Socket API<\/h3>\n\n\n\n<p>Die APIs <code>java.net.Socket<\/code> und <code>java.net.ServerSocket<\/code> existieren seit Java 1.0. Der zugrundeliegende Code (eine Mischung aus Java- und C-Code) ist schwer wart- und erweiterbar, besonders im Hinblick auf <a rel=\"noopener\" href=\"https:\/\/openjdk.org\/projects\/loom\/\" target=\"_blank\">Project Loom<\/a>, mit dem <a href=\"\/de\/java\/virtual-threads\/\">Virtuelle Threads<\/a> (leichtgewichtige, durch die JVM verwaltete Threads) eingef\u00fchrt werden sollen.<\/p>\n\n\n\n<p>Mit dem <a rel=\"noopener\" href=\"https:\/\/openjdk.org:443\/jeps\/353\" target=\"_blank\">JDK Enhancement Proposal 353<\/a> wird die alte Implementierung durch eine modernere, besser wart- und erweiterbare Implementierung ersetzt, die sich inbesondere auch ohne weitere Refactorings an Project Loom anpassen lassen soll.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"unicode-12-1\">Unicode 12.1<\/h3>\n\n\n\n<p>Wie schon in den vorangegangenen zwei Java-Releases wurde auch in Java 13 der Unicode-Support erh\u00f6ht \u2013 auf Version 12.1. Das bedeutet, dass Klassen wie z. B. <code>String<\/code> und <code>Character<\/code> mit den neuen Zeichen, Codebl\u00f6cken und Schriftsystemen umgehen k\u00f6nnen m\u00fcssen.<\/p>\n\n\n\n<p>Ein Beispiel dazu findest du im Artikel \u00fcber <a rel=\"noopener\" href=\"https:\/\/www.happycoders.eu\/de\/java\/java-11-features\/#Unicode_10\" target=\"_blank\">Unicode 10 in Java 11<\/a>.<\/p>\n\n\n\n<p><em>(F\u00fcr die Unterst\u00fctzung von Unicode 12.1 existiert kein JDK Enhancement Proposal.)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"vollstaendige-liste-aller-aenderungen-in-java-13\">Vollst\u00e4ndige Liste aller \u00c4nderungen in Java 13<\/h3>\n\n\n\n<p>Dieser Artikel hat alle Features von Java 13 vorgestellt, die in JDK Enhancement Proposals definiert sind, sowie Erweiterungen an der JDK-Klassenbibliothek, die keinem JEP zugeordnet sind.<\/p>\n\n\n\n<p>Eine vollst\u00e4ndige Liste aller \u00c4nderungen findest du in den <a rel=\"noopener\" href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/13-relnote-issues.html\" target=\"_blank\">offiziellen Java 13 Release Notes<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"fazit\">Fazit<\/h2>\n\n\n\n<p>Java 13 ist ein sehr \u00fcberschaubares Release. <\/p>\n\n\n\n<p>Im zweiten Preview der \"Switch Expressions\" wurde <code>break<\/code> durch <code>yield<\/code> ersetzt. Mit dem Preview von \"Text Blocks\" halten endlich mehrzeilige Strings Einzug in die Sprache.<\/p>\n\n\n\n<p>Der noch experimentelle ZGC kann ungenutzten Speicher an das Betriebssystem zur\u00fcckgeben und mit einer \"weichen\" maximalen Heap-Gr\u00f6\u00dfe konfiguriert werden.<\/p>\n\n\n\n<p>Mit \"Dynamic CDS Archives\" ist es ab Java 13 ein Kinderspiel Application Class Data Sharing einzusetzen.<\/p>\n\n\n\n<p><code>ByteBuffer<\/code> wurde um Methoden erweitert, um lesend und schreibend auf absolute Positionen zuzugreifen, und es gibt einige neue Varianten der <code>FileSystems.newFileSystem()<\/code>-Methode.<\/p>\n\n\n\n<p>Die aus Java 1.0 stammende Socket API wurde komplett neugeschrieben, um fit f\u00fcr die in Project Loom entwickelten leichtgewichtige Threads zu sein.<\/p>\n\n\n\n<p>Wenn dir der Artikel gefallen hat, freue ich mich sehr \u00fcber einen Kommentar, oder wenn du den Artikel \u00fcber einen der Share-Buttons am Ende teilst.<\/p>\n\n\n\n<p>Wenn du informiert werden m\u00f6chtest, wenn der n\u00e4chste Teil der Serie online geht, <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alle neuen Features von Java 13: Switch Expressions (2nd Preview), Text Blocks (Preview), Dynamic CDS Archives + More<\/p>\n","protected":false},"author":1,"featured_media":34275,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Alle neuen Features von Java 13 mit Beispielen: Switch Expressions (2nd Preview), Text Blocks (Preview), Dynamic CDS Archives + mehr...","_seopress_robots_index":"","_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":12160,"_post_count":0,"footnotes":""},"categories":[64],"tags":[176],"class_list":["post-23650","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-versionen"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/11\/java-13-features.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Alle neuen Features von Java 13: Switch Expressions (2nd Preview), Text Blocks (Preview), Dynamic CDS Archives + More","public_identification_id":"3bd622a7eee84de5a288d2c9bd24a27d","private_identification_id":"47bf5b7a8d07471c8dd85215049bd1b6","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/23650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=23650"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/23650\/revisions"}],"predecessor-version":[{"id":39766,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/23650\/revisions\/39766"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34275"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=23650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=23650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=23650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}