{"id":4690,"date":"2023-08-26T15:37:06","date_gmt":"2023-08-26T13:37:06","guid":{"rendered":"https:\/\/www.tutego.de\/blog\/javainsel\/?p=4690"},"modified":"2023-08-26T15:37:06","modified_gmt":"2023-08-26T13:37:06","slug":"enum-im-switch-mit-pattern-matching-in-java-21","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2023\/08\/enum-im-switch-mit-pattern-matching-in-java-21\/","title":{"rendered":"Inselupdate: enum im switch mit Pattern-Matching in Java 21"},"content":{"rendered":"<p>Seit Java 21 ist die M\u00f6glichkeit vom switch stark erweitert worden. Das betrifft auch Aufz\u00e4hlungstypen. Es war immer ein wenig umst\u00e4ndlich, wenn ein switch Konstanten von verschiedenen Aufz\u00e4hlungstypen vergleichen sollte. Das ist einfacher geworden und dazu ein kleines Beispiel. Nehmen wir zwei enum an, die keine Typbeziehung haben:<\/p>\n<pre>enum CoffeeSize { SMALL, LARGE }\r\n\r\nenum TeeSize { SMALL, LARGE }<\/pre>\n<p>Die Gr\u00f6\u00dfen sollen nun zusammen behandelt werden. Wir k\u00f6nnen schreiben:<\/p>\n<pre>static void orderSize( Enum size ) {\r\n\r\n\u00a0 switch ( size ) {\r\n\r\n\u00a0\u00a0\u00a0 case CoffeeSize.SMALL -&gt; System.out.println( \"Small\" );\r\n\r\n\u00a0\u00a0\u00a0 case TeeSize.SMALL -&gt; System.out.println( \"Small\" );\r\n\r\n\u00a0\u00a0\u00a0 case CoffeeSize.LARGE -&gt; System.out.println( \"Large\" );\r\n\r\n\u00a0\u00a0\u00a0 case TeeSize.LARGE -&gt; System.out.println( \"Large\" );\r\n\r\n\u00a0\u00a0\u00a0 default -&gt; {\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0 }\r\n\r\n}<\/pre>\n<p>Da der Compiler von allen einen beliebigen Enum ausgeht, kann er keine vollst\u00e4ndige Abdeckung erkennen. Wir k\u00f6nnen das mit einem Basistyp allerdings l\u00f6sen,<\/p>\n<p>Wenn ein switch-Ausdruck mit einem einzelnen Aufz\u00e4hlungstyp verwendet wird, kann der Compiler \u00fcberpr\u00fcfen, ob alle Aufz\u00e4hlungselemente abgedeckt sind und ob ein default-Zweig entfallen kann. Der Compiler kann auch eine vollst\u00e4ndige Abdeckung \u00fcberpr\u00fcfen, wenn der switch-Block <em>verschiedene<\/em> Aufz\u00e4hlungstypen behandelt und dabei ein versiegeltes Interface als Basistyp verwendet wird. Betragen wir das Beispiel aus dem vorherigen Kapitel erneut und schreiben es um:<\/p>\n<pre>sealed interface <strong>DrinkSize permits CoffeeSize, TeeSize {}<\/strong>\r\n\r\nenum CoffeeSize implements DrinkSize { SMALL, LARGE }\r\n\r\nenum TeeSize implements DrinkSize { SMALL, LARGE }\r\n\r\n\r\n\r\n\r\nstatic void orderSize( <strong>DrinkSize<\/strong> size ) {\r\n\r\n\u00a0 switch ( size ) {\r\n\r\n\u00a0\u00a0 \u00a0case CoffeeSize.SMALL -&gt; System.out.println( \"Small\" );\r\n\r\n\u00a0\u00a0\u00a0 case TeeSize.SMALL -&gt; System.out.println( \"Small\" );\r\n\r\n\u00a0\u00a0\u00a0 case CoffeeSize.LARGE -&gt; System.out.println( \"Large\" );\r\n\r\n\u00a0\u00a0\u00a0 case TeeSize.LARGE -&gt; System.out.println( \"Large\" );\r\n\r\n\u00a0 }\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit Java 21 ist die M\u00f6glichkeit vom switch stark erweitert worden. Das betrifft auch Aufz\u00e4hlungstypen. Es war immer ein wenig umst\u00e4ndlich, wenn ein switch Konstanten von verschiedenen Aufz\u00e4hlungstypen vergleichen sollte. Das ist einfacher geworden und dazu ein kleines Beispiel. Nehmen wir zwei enum an, die keine Typbeziehung haben: enum CoffeeSize { SMALL, LARGE } enum [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,124],"tags":[],"class_list":["post-4690","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-21"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4690","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4690"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4690\/revisions"}],"predecessor-version":[{"id":4691,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4690\/revisions\/4691"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}