{"id":4478,"date":"2020-03-07T19:46:13","date_gmt":"2020-03-07T17:46:13","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4478"},"modified":"2020-03-07T19:46:13","modified_gmt":"2020-03-07T17:46:13","slug":"switch-expressions-java-14","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2020\/03\/switch-expressions-java-14\/","title":{"rendered":"Switch Expressions"},"content":{"rendered":"<p>Java hat seit Version 1.0 eine switch-Anweisung zum Kontrollfluss. Im Wesentlichen basiert die Syntax auf der Programmiersprache C, die auf die 1970er Jahre zur\u00fcckgeht. In Java 12 wurde eine neue Syntax probeweise eingef\u00fchrt, in Java 13 ver\u00e4ndert und in Java 14 endg\u00fcltig integriert.<\/p>\n<p>Insgesamt kann switch in vier Formen auftauchen:<\/p>\n<table width=\"103%\">\n<tbody>\n<tr>\n<td width=\"24%\">Anweisung\/Ausdruck<\/td>\n<td width=\"19%\">Ab Java-Version<\/td>\n<td width=\"17%\">Syntax<\/td>\n<td width=\"13%\">Durchfall<\/td>\n<td width=\"26%\">vollst\u00e4ndige Abdeckung<\/td>\n<\/tr>\n<tr>\n<td width=\"24%\">Anweisung<\/td>\n<td width=\"19%\">1.0<\/td>\n<td width=\"17%\">:<\/td>\n<td width=\"13%\">Ja<\/td>\n<td width=\"26%\">Nein<\/td>\n<\/tr>\n<tr>\n<td width=\"24%\">Anweisung<\/td>\n<td width=\"19%\">14<\/td>\n<td width=\"17%\">-&gt;<\/td>\n<td width=\"13%\">Nein<\/td>\n<td width=\"26%\">Nein<\/td>\n<\/tr>\n<tr>\n<td width=\"24%\">Ausdruck<\/td>\n<td width=\"19%\">14<\/td>\n<td width=\"17%\">:<\/td>\n<td width=\"13%\">Ja<\/td>\n<td width=\"26%\">Ja<\/td>\n<\/tr>\n<tr>\n<td width=\"24%\">Ausdruck<\/td>\n<td width=\"19%\">14<\/td>\n<td width=\"17%\">-&gt;<\/td>\n<td width=\"13%\">Nein<\/td>\n<td width=\"26%\">Ja<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Vier Typen von switch<\/p>\n<p>Den ersten Typ haben wir schon ausgiebig betrachtet, schauen wir uns die weiteren Varianten an.<\/p>\n<h4>Vereinfachte Switch-Anweisung, kein Durchfall, keine vollst\u00e4ndige Abdeckung<\/h4>\n<p>Bei der vereinfachten switch-Anweisung steht hinter dem Label bzw. default kein Doppelpunkt, sondern ein -&gt;. Dieser hat nichts mit Lambda-Ausdrucken zu tun, auch wenn die Symbole gleich sind. Hinter dem Pfeil steht entweder ein Ausdruck, ein Block in geschweiften Klammern oder ein throw-Anweisung, die eine Ausnahme ausl\u00f6st. Implizit beendet ein break jeden Zweig, es gibt also kein Durchfallen mehr.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nswitch ( operator ) {\r\n\r\n\u00a0 case \"+\" -&gt; System.out.println( \"Plus\" );\r\n\r\n\u00a0 case \"-\" -&gt; { String minus = \"Minus\"; System.out.println( minus ); }\r\n\r\n}<\/pre>\n<p>Dadurch, dass bei mehreren Anweisungen immer Bl\u00f6cke gesetzt werden m\u00fcssen, tritt eine lokale Variable auch nicht aus dem Bereich aus.<\/p>\n<p>Ein default kann gesetzt werden, muss aber nicht. Das switch muss nicht jede M\u00f6glichkeit abdecken, was bei Zahlen und Strings eh nicht funktioniert.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nswitch ( operator ) {\r\n\r\n\u00a0 case \"+\" -&gt; System.out.println( \"Plus\" );\r\n\r\n\u00a0 case \"-\" -&gt; System.out.println( \"Minus\" );\r\n\r\n\u00a0 default \u00a0-&gt; System.out.println( \"Unbekannter Operator\" );\r\n\r\n}<\/pre>\n<p>Bei vereinfachten switch-Anweisungen sind mehrere Labels m\u00f6glich, die die gleiche Behandlung haben. Kommas trennen die Labels.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nswitch ( operator ) {\r\n\r\n\u00a0 case \"+\" \u00a0\u00a0\u00a0\u00a0\u00a0-&gt; System.out.println( \"Plus\" );\r\n\r\n\u00a0 <strong>case \"*\", \"\u00d7\"<\/strong> -&gt; System.out.println( \"Mal\" );\r\n\r\n}<\/pre>\n<h4>Switch-Ausdr\u00fccke, kein Durchfall, vollst\u00e4ndige Abdeckung<\/h4>\n<p>Traditionell finden sich die Fallunterscheidungen mit switch als Anweisung und Anweisungen geben nichts zur\u00fcck. In Java 14 ist es m\u00f6glich, switch als Ausdruck mit Ergebnis zu nutzen.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nString writtenOperator = (switch ( operator ) {\r\n\r\n\u00a0 case \"+\" -&gt; \"Plus\";\r\n\r\n\u00a0 case \"-\" -&gt; \"Minus\";\r\n\r\n\u00a0 default \u00a0-&gt; \"Unbekannter Operator\";\r\n\r\n} ).toUpperCase();\r\n\r\nSystem.out.println( writtenOperator );<\/pre>\n<p>Ausdr\u00fccke m\u00fcssen immer Ergebnisse liefern, und folglich muss switch immer einen Pfad auf einen Wert nehmen. Der \u00fcbliche Fall ist default wie gezeigt, es gibt allerdings Sonderf\u00e4lle, wie bei Aufz\u00e4hlungen, wo der Compiler pr\u00fcfen kann, dass alle M\u00f6glichkeiten abgedeckt sind.<\/p>\n<p>Beispiel<\/p>\n<pre>DayOfWeek today = LocalDate.now().getDayOfWeek();\r\n\r\nSystem.out.println( switch ( today ) {\r\n\r\n\u00a0 case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -&gt; \"Arbeit\";\r\n\r\n\u00a0 case SATURDAY, SUNDAY -&gt; \"Party\";\r\n\r\n} );<\/pre>\n<p>Falls rechts neben dem Pfeil kein einfacher Ausdruck steht, sondern ein Block muss auch dieser Block ein Ergebnis zur\u00fcckgeben. Daf\u00fcr wird das neue Schl\u00fcsselwort yield eingesetzt, hinter dem ein Ausdruck kommt.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nSystem.out.println( switch ( operator ) {\r\n\r\n\u00a0 case \"+\" -&gt; \"Plus\";\r\n\r\n\u00a0 case \"-\" -&gt; { String minus = \"Minus\"; <strong>yield<\/strong> minus; }\r\n\r\n\u00a0 default \u00a0-&gt; throw new IllegalArgumentException( \"Unknown operator\" );\r\n\r\n} );<\/pre>\n<p>Ein Block muss ein yield besitzen oder eine ungepr\u00fcfte Ausnahme ausl\u00f6sen.<\/p>\n<h4>Switch-Expression mit :-Syntax, mit Durchfall, vollst\u00e4ndige Abdeckung<\/h4>\n<p>Auch die Doppelpunkt-Syntax l\u00e4sst sich als Ausdruck einsetzten, mit ihr ist auch ein Durchfall wieder m\u00f6glich; ein yield ist zwingend, oder eine ungepr\u00fcfte Ausnahme. Die Syntax birgt mit dem Durchfallen eine Fehlerquelle, sodass es vielleicht die schlechteste Variante ist.<\/p>\n<p>Beispiel<\/p>\n<pre>String operator = \"+\";\r\n\r\nSystem.out.println( switch ( operator ) {\r\n\r\ncase \"+\" : yield \"Plus\";\r\n\r\ncase \"*\" : System.out.println( \"Sternchen\" );\r\n\r\ncase \"\u00d7\" : yield \"Mal\";\r\n\r\ndefault \u00a0: throw new IllegalArgumentException( \"Unknown operator\" );\r\n\r\n} );<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Java hat seit Version 1.0 eine switch-Anweisung zum Kontrollfluss. Im Wesentlichen basiert die Syntax auf der Programmiersprache C, die auf die 1970er Jahre zur\u00fcckgeht. In Java 12 wurde eine neue Syntax probeweise eingef\u00fchrt, in Java 13 ver\u00e4ndert und in Java 14 endg\u00fcltig integriert. Insgesamt kann switch in vier Formen auftauchen: Anweisung\/Ausdruck Ab Java-Version Syntax Durchfall [&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,112],"tags":[],"class_list":["post-4478","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-14"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4478","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=4478"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4478\/revisions"}],"predecessor-version":[{"id":4481,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4478\/revisions\/4481"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}