{"id":555,"date":"2024-11-28T15:00:56","date_gmt":"2024-11-28T14:00:56","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=555"},"modified":"2025-01-06T15:05:08","modified_gmt":"2025-01-06T14:05:08","slug":"pattern-matching-in-java-21","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=555","title":{"rendered":"Pattern Matching in Java 21"},"content":{"rendered":"\n<p>Java hat sich \u00fcber die Jahre zu einer modernen und vielseitigen Programmiersprache entwickelt. Mit der Einf\u00fchrung von Pattern Matching in Java 16 und den darauffolgenden Erweiterungen bis Java 21 wurde das Programmierparadigma der Sprache wesentlich erweitert. Dieses Feature macht den Code nicht nur pr\u00e4gnanter und lesbarer, sondern verbessert auch die Typsicherheit und reduziert Boilerplate-Code. In diesem Artikel betrachten wir die Entwicklungen von Pattern Matching in Java 21 und wie es zur modernen Softwareentwicklung beitr\u00e4gt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Was ist Pattern Matching?<\/h3>\n\n\n\n<p>Pattern Matching ist ein Konzept, das aus funktionalen Programmiersprachen wie Haskell oder Scala stammt. Es erm\u00f6glicht das \u00dcberpr\u00fcfen von Objekten auf bestimmte Muster und deren Entpackung in einer kompakten Syntax. In Java bedeutet dies konkret, dass ein Objekt einer Klasse \u00fcberpr\u00fcft und gleichzeitig in eine Variable einer passenden Typisierung umgewandelt werden kann, ohne expliziten Cast.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Evolution des Pattern Matching in Java<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Pattern Matching for instanceof (Java 16)<\/h4>\n\n\n\n<p>Vor Java 16 war das \u00dcberpr\u00fcfen eines Objekts auf einen bestimmten Typ umst\u00e4ndlich:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">String<\/span>) {\n    <span class=\"hljs-built_in\">String<\/span> str = (<span class=\"hljs-built_in\">String<\/span>) obj;\n    System.out.println(str.length());\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit Pattern Matching wurde dies wesentlich vereinfacht:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">String<\/span> str) {\n    System.out.println(str.length());\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird das Objekt <code>obj<\/code> nicht nur auf den Typ <code>String<\/code> \u00fcberpr\u00fcft, sondern gleichzeitig als Variable <code>str<\/code> definiert. Das reduziert Redundanz und steigert die Lesbarkeit.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Switch Expressions mit Pattern Matching (Java 17 und Java 19)<\/h4>\n\n\n\n<p>Switch-Expressions wurden in Java 14 eingef\u00fchrt und in Kombination mit Pattern Matching erweitert. Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">switch<\/span> (obj) {\n    <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-built_in\">String<\/span> str -&gt; System.out.println(<span class=\"hljs-string\">\"String mit L\u00e4nge: \"<\/span> + str.length());\n    <span class=\"hljs-keyword\">case<\/span> Integer i -&gt; System.out.println(<span class=\"hljs-string\">\"Integer-Wert: \"<\/span> + i);\n    <span class=\"hljs-keyword\">default<\/span> -&gt; System.out.println(<span class=\"hljs-string\">\"Unbekannter Typ\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dies erlaubt es, verschiedene Typen in einem Switch auszuwerten, ohne explizite Casts oder separate if-Bl\u00f6cke zu verwenden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Rekursive Pattern (Java 21)<\/h4>\n\n\n\n<p>Java 21 f\u00fchrt die M\u00f6glichkeit ein, verschachtelte Muster zu definieren. Dies ist besonders n\u00fctzlich f\u00fcr komplexe Datenstrukturen wie Collections oder rekursive Klassen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">record Point(int x, int y) {}\nrecord Rectangle(Point topLeft, Point bottomRight) {}\n\npublic <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> printRectangle(<span class=\"hljs-built_in\">Object<\/span> obj) {\n    <span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> Rectangle(Point(int x1, int y1), Point(int x2, int y2))) {\n        System.out.println(<span class=\"hljs-string\">\"Rechteck von &#91;\"<\/span> + x1 + <span class=\"hljs-string\">\", \"<\/span> + y1 + <span class=\"hljs-string\">\"] bis &#91;\"<\/span> + x2 + <span class=\"hljs-string\">\", \"<\/span> + y2 + <span class=\"hljs-string\">\"]\"<\/span>);\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird die Struktur des <code>Rectangle<\/code> rekursiv entpackt, um Zugriff auf die Werte der verschachtelten <code>Point<\/code>-Objekte zu erhalten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Exhaustiveness in Switch Statements<\/h4>\n\n\n\n<p>Eine weitere Verbesserung ist die Exhaustiveness-Pr\u00fcfung, die sicherstellt, dass alle m\u00f6glichen F\u00e4lle in einem Switch-Statement abgedeckt sind, wenn Pattern Matching verwendet wird. Dies erh\u00f6ht die Typsicherheit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sealed <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Shape<\/span> <span class=\"hljs-title\">permits<\/span> <span class=\"hljs-title\">Circle<\/span>, <span class=\"hljs-title\">Rectangle<\/span> <\/span>{}\nrecord Circle(double radius) implements Shape {}\nrecord Rectangle(double width, double height) implements Shape {}\n\nvoid printShape(Shape shape) {\n    <span class=\"hljs-keyword\">switch<\/span> (shape) {\n        <span class=\"hljs-keyword\">case<\/span> Circle c -&gt; System.out.println(<span class=\"hljs-string\">\"Kreis mit Radius \"<\/span> + c.radius());\n        <span class=\"hljs-keyword\">case<\/span> Rectangle r -&gt; System.out.println(<span class=\"hljs-string\">\"Rechteck mit Breite \"<\/span> + r.width() + <span class=\"hljs-string\">\" und H\u00f6he \"<\/span> + r.height());\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Da <code>Shape<\/code> eine sealed interface ist, stellt der Compiler sicher, dass alle m\u00f6glichen Untertypen behandelt werden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Vorteile von Pattern Matching<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Verbesserte Lesbarkeit:<\/strong> Der Code ist k\u00fcrzer, klarer und leichter zu verstehen.<\/li>\n\n\n\n<li><strong>Weniger Fehleranf\u00e4lligkeit:<\/strong> Casts und Typ\u00fcberpr\u00fcfungen werden automatisch behandelt, wodurch die Wahrscheinlichkeit von ClassCastException reduziert wird.<\/li>\n\n\n\n<li><strong>Erweiterte Typsicherheit:<\/strong> Dank der Exhaustiveness-Pr\u00fcfung und der Integration mit sealed classes wird der Code sicherer.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t:<\/strong> Die Unterst\u00fctzung f\u00fcr rekursive Muster erm\u00f6glicht es, auch komplexe Datenstrukturen elegant zu behandeln.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anwendungsbeispiele<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Verarbeitung von JSON-Objekten<\/h4>\n\n\n\n<p>Pattern Matching kann verwendet werden, um dynamische Datenstrukturen wie JSON effizient zu verarbeiten:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> processJson(<span class=\"hljs-built_in\">Object<\/span> json) {\n    <span class=\"hljs-keyword\">if<\/span> (json <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">Map<\/span>&lt;?, ?&gt; map) {\n        map.forEach((key, value) -&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (value <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">String<\/span> str) {\n                System.out.println(key + <span class=\"hljs-string\">\" ist ein String: \"<\/span> + str);\n            } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (value <span class=\"hljs-keyword\">instanceof<\/span> Integer i) {\n                System.out.println(key + <span class=\"hljs-string\">\" ist ein Integer: \"<\/span> + i);\n            }\n        });\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">2. GUI-Event-Verarbeitung<\/h4>\n\n\n\n<p>In Anwendungen mit grafischen Benutzeroberfl\u00e4chen (GUI) k\u00f6nnen verschiedene Event-Typen effizient verarbeitet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> handleEvent(<span class=\"hljs-built_in\">Object<\/span> event) {\n    <span class=\"hljs-keyword\">switch<\/span> (event) {\n        <span class=\"hljs-keyword\">case<\/span> MouseEvent me -&gt; System.out.println(<span class=\"hljs-string\">\"Mouse Event: \"<\/span> + me.getCoordinates());\n        <span class=\"hljs-keyword\">case<\/span> KeyEvent ke -&gt; System.out.println(<span class=\"hljs-string\">\"Key Event: \"<\/span> + ke.getKeyCode());\n        <span class=\"hljs-keyword\">default<\/span> -&gt; System.out.println(<span class=\"hljs-string\">\"Unbekanntes Event\"<\/span>);\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Einschr\u00e4nkungen und Herausforderungen<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komplexit\u00e4t der Syntax:<\/strong> F\u00fcr Entwickler, die neu in Java oder funktionalen Konzepten sind, kann die Syntax anfangs verwirrend sein.<\/li>\n\n\n\n<li><strong>Performance:<\/strong> Obwohl Pattern Matching effizient implementiert ist, kann es bei sehr tiefen rekursiven Mustern zu Performance-Einbu\u00dfen kommen.<\/li>\n\n\n\n<li><strong>Abw\u00e4rtskompatibilit\u00e4t:<\/strong> Projekte, die auf \u00e4lteren Java-Versionen laufen, k\u00f6nnen nicht von diesen Features profitieren.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Pattern Matching in Java 21 ist ein bedeutender Schritt in Richtung einer moderneren und funktionaleren Programmierung. Es reduziert Boilerplate-Code, erh\u00f6ht die Lesbarkeit und steigert die Typsicherheit. Mit den neuen Features wie rekursiven Mustern und verbesserten Switch-Statements bietet es Entwicklern leistungsf\u00e4hige Werkzeuge, um komplexe Probleme zu l\u00f6sen.<\/p>\n\n\n\n<p>Die Zukunft von Java liegt in der Weiterentwicklung solcher Features, die die Sprache anpassungsf\u00e4higer und benutzerfreundlicher machen. Entwickler sollten sich mit Pattern Matching vertraut machen, um das Potenzial moderner Java-Versionen voll auszusch\u00f6pfen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java hat sich \u00fcber die Jahre zu einer modernen und vielseitigen Programmiersprache entwickelt. Mit der Einf\u00fchrung von Pattern Matching in Java 16 und den darauffolgenden Erweiterungen bis Java 21 wurde das Programmierparadigma der Sprache wesentlich erweitert. Dieses Feature macht den Code nicht nur pr\u00e4gnanter und lesbarer, sondern verbessert auch die Typsicherheit und reduziert Boilerplate-Code. In [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-555","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=555"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/555\/revisions"}],"predecessor-version":[{"id":556,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/555\/revisions\/556"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}