{"id":22724,"date":"2025-05-03T05:12:01","date_gmt":"2025-05-03T03:12:01","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22724"},"modified":"2025-05-02T19:46:20","modified_gmt":"2025-05-02T17:46:20","slug":"pattern-matching-fuer-switch-3","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22724","title":{"rendered":"Pattern Matching f\u00fcr switch (3)"},"content":{"rendered":"<p>Pattern Matching im switch-Statement ist seit Java 21 ein vollwertiges Feature, das die Ausdruckskraft und Lesbarkeit von Code deutlich erh\u00f6ht. Es erm\u00f6glicht, dass case-Labels nicht nur konstante Werte, sondern auch Typmuster und Bedingungen enthalten k\u00f6nnen, wodurch komplexe Entscheidungslogik kompakter und sicherer gestaltet werden kann. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records.jpg\" alt=\"\" width=\"1920\" height=\"1080\" class=\"aligncenter size-full wp-image-22710\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records.jpg 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-300x169.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-1024x576.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-768x432.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/05\/records-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Mit Pattern Matching im switch lassen sich beispielsweise unterschiedliche Objektarten direkt im <strong>switch-Statement<\/strong> abfragen und verarbeiten, ohne vorheriges instanceof und explizites Casting. <!--more--><\/p>\n<p>Neu ist auch, dass der switch jetzt explizit auf null-Werte pr\u00fcfen kann, indem ein case null definiert wird, was die Behandlung von Nullwerten vereinfacht. <\/p>\n<p>Ein Beispiel mit <a href=\"http:\/\/Pattern Matching for switch\" target=\"_blank\">Pattern Matching in switch<\/a>:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twrente;\r\n\r\n\/**\r\n * Verwendung von Record Patterns mit switch.\r\n * \r\n * Mit JEP 440 https:\/\/openjdk.org\/jeps\/440 in Java 21 eingef\u00fchrt\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class StartJava21Switch {\r\n\r\n\trecord Point(int i, int j) {\r\n\t}\r\n\r\n\tenum Color {\r\n\t\tRED, GREEN, BLUE;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\ttypeTester(Color.RED);\r\n\r\n\t\tPoint punkt = new Point(4, 2);\r\n\t\ttypeTester(punkt);\r\n\r\n\t\ttypeTester(null); \/\/ geht auch\r\n\r\n\t\ttypeTester(\"null\"); \/\/ String geht auch, aber nicht im null case\r\n\r\n\t\ttypeTester(Long.MAX_VALUE); \/\/ default Zweig\r\n\r\n\t}\r\n\r\n\tstatic void typeTester(Object obj) {\r\n\t\tswitch (obj) {\r\n\t\tcase null -&gt; System.out.println(\"null\");\r\n\t\tcase String s -&gt; System.out.println(\"String\");\r\n\t\tcase Color c -&gt; System.out.println(\"Color: \" + c.toString());\r\n\t\tcase Point p -&gt; System.out.println(\"Record class: \" + p.toString());\r\n\t\tcase int[] ia -&gt; System.out.println(\"Array of ints of length\" + ia.length);\r\n\t\tdefault -&gt; System.out.println(\"Default, nicht behandelt: \" + obj);\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Durch die Einf\u00fchrung von sogenannten Guarded Patterns mit dem when-Schl\u00fcsselwort lassen sich zudem zus\u00e4tzliche Bedingungen innerhalb eines case formulieren. Insgesamt f\u00fchrt Pattern Matching im switch zu k\u00fcrzerem, verst\u00e4ndlicherem und weniger fehleranf\u00e4lligem Java-Code.<\/p>\n<p>Noch ein Beispiel:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twrente;\r\n\r\n\/**\r\n * Verwendung von Record Patterns mit switch.\r\n * \r\n * Mit JEP 440 https:\/\/openjdk.org\/jeps\/440 in Java 21 eingef\u00fchrt\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class StartJava21Switch {\r\n\r\n\trecord Point(int i, int j) {\r\n\t}\r\n\r\n\tenum Color {\r\n\t\tRED, GREEN, BLUE;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\ttypeTester(Color.RED);\r\n\r\n\t\tPoint punkt = new Point(4, 2);\r\n\t\ttypeTester(punkt);\r\n\r\n\t\ttypeTester(null); \/\/ geht auch\r\n\r\n\t\ttypeTester(\"null\"); \/\/ String geht auch, aber nicht im null case\r\n\r\n\t\ttypeTester(Long.MAX_VALUE); \/\/ default Zweig\r\n\r\n\t\t\/\/ und f\u00fcr Guarded Patterns mit dem when-Schl\u00fcsselwort\r\n\t\tcheckNumber(Integer.valueOf(42));\r\n\t\tcheckNumber(Integer.valueOf(-42));\r\n\t\tcheckNumber(Long.valueOf(42));\r\n\t\t\/\/checkNumber(null); \/\/ geht nicht, wirft NullPointerException\r\n\t}\r\n\r\n\tstatic void checkNumber(Object obj) {\r\n\t\tswitch (obj) {\r\n\t\tcase Integer i when i &gt; 0 -&gt; System.out.println(\"Positive Zahl\");\r\n\t\tcase Integer i when i &lt; 0 -&gt; System.out.println(\"Negative Zahl\");\r\n\t\tcase Integer i -&gt; System.out.println(\"Null\");\r\n\t\tdefault -&gt; System.out.println(\"Kein Integer, sondern \" + obj);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic void typeTester(Object obj) {\r\n\t\tswitch (obj) {\r\n\t\tcase null -&gt; System.out.println(\"null\");\r\n\t\tcase String s -&gt; System.out.println(\"String\");\r\n\t\tcase Color c -&gt; System.out.println(\"Color: \" + c.toString());\r\n\t\tcase Point p -&gt; System.out.println(\"Record class: \" + p.toString());\r\n\t\tcase int[] ia -&gt; System.out.println(\"Array of ints of length\" + ia.length);\r\n\t\tdefault -&gt; System.out.println(\"Default, nicht behandelt: \" + obj);\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Ergebnis:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\nColor: RED\r\nRecord class: Point[i=4, j=2]\r\nnull\r\nString\r\nDefault, nicht behandelt: 9223372036854775807\r\nPositive Zahl\r\nNegative Zahl\r\nKein Integer, sondern 42\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Pattern Matching im switch-Statement ist seit Java 21 ein vollwertiges Feature, das die Ausdruckskraft und Lesbarkeit von Code deutlich erh\u00f6ht. Es erm\u00f6glicht, dass case-Labels nicht nur konstante Werte, sondern auch Typmuster und Bedingungen enthalten k\u00f6nnen, wodurch komplexe Entscheidungslogik kompakter und sicherer gestaltet werden kann. Mit Pattern Matching im switch lassen sich beispielsweise unterschiedliche Objektarten direkt &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22724\" class=\"more-link\"><span class=\"screen-reader-text\">\u201ePattern Matching f\u00fcr switch (3)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,5,6180],"tags":[125,2178,6205,6196,6198,6200,183],"class_list":["post-22724","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-java-21","tag-entwicklung","tag-java","tag-pattern-matching","tag-records","tag-records-tag","tag-recordschallenge","tag-switch"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22724"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22724\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22724"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22724"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}