Java 12 ist raus. Ich denke, es gibt verschiedene Änderungen und neue Funktionen, aber ich habe die switch-Anweisung (oder den switch-Ausdruck) ausprobiert, die die offensichtlichste Änderung ist.
Die Art und Weise, eine neue switch-Anweisung zu schreiben, scheint ab Java 12 als Vorschaufunktion positioniert zu sein, und Sie müssen Optionen zur Kompilierungs- und Laufzeit hinzufügen.
Zur Kompilierungszeit
javac --enable-preview --release 12 MultiCaseSample.java
Laufzeit
java --enable-preview MultiCaseSample
Auch der hier geschriebene Inhalt kann sich in Zukunft ändern.
Sie können in der case-Klausel mehrere Werte angeben, die durch Kommas getrennt sind.
public class MultiCaseSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
switch(month) {
case 1, 2:
System.out.println("Es ist Winter");
break;
case 3, 4, 5:
System.out.println("Es ist Frühling");
break;
case 6, 7, 8:
System.out.println("Der Höhepunkt des Sommers");
break;
case 9, 10, 11:
System.out.println("Unser Herbst steht vor der Tür!");
break;
case 12:
System.out.println("Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen");
break;
default:
System.out.println("Es gibt keinen solchen Monat");
}
}
}
Schreiben Sie den Satz nach dem Symbol "->". Sie können die Beschreibung von Doppelpunkt und Unterbrechung weglassen. Es scheint, dass Sie die mehrzeilige Verarbeitung mithilfe von Blöcken schreiben können. (Im folgenden Beispiel ist es eine Zeile ...) Außerdem benötigen Sie nach dem Klammern zum Schließen des Blocks kein Semikolon.
public class ArrowSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
switch(month) {
case 1, 2 -> System.out.println("Es ist Winter");
case 3, 4, 5 -> System.out.println("Es ist Frühling");
case 6, 7, 8 -> System.out.println("Der Höhepunkt des Sommers");
case 9, 10, 11 -> System.out.println("Unser Herbst steht vor der Tür!");
case 12 -> System.out.println("Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen");
default -> {
System.out.println("Es gibt keinen solchen Monat");
}
}
}
}
Die switch-Anweisung ist jetzt ein switch-Ausdruck. Der Unterschied zwischen Anweisungen und Ausdrücken besteht darin, dass erstere keinen Wert zurückgeben, während letztere einen Wert zurückgeben. Sie können also das Bewertungsergebnis des switch-Ausdrucks der Variablen so wie sie ist zuweisen. In diesem Fall ist nach der schließenden Klammer des Schalters ein Semikolon erforderlich.
Wenn nicht alle Muster abgedeckt sind (in diesem Beispiel gibt es keine Standardklausel), tritt ein Kompilierungsfehler auf. Es ist besser, als implizit null zuzuweisen. Wenn Sie die Pfeilsyntax nicht verwenden oder keine Blöcke verwenden, wird der zurückzugebende Wert nach break beschrieben.
public class SwitchExpressionSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2 -> "Es ist Winter";
case 3, 4, 5 -> "Es ist Frühling";
case 6, 7, 8 -> {
break "Der Höhepunkt des Sommers";
}
case 9, 10, 11 -> "Unser Herbst steht vor der Tür!";
case 12 -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
default -> "Es gibt keinen solchen Monat";
};
System.out.println(message);
}
}
Anscheinend führt das Mischen der Pfeilsyntax mit der herkömmlichen Syntax zu einem Kompilierungsfehler. Also habe ich ein Muster geschrieben, das die Pfeilsyntax nicht separat verwendet.
public class SwitchExpressionBreakSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2:
break "Es ist Winter";
case 3, 4, 5:
break "Es ist Frühling";
case 6, 7, 8:
break "Der Höhepunkt des Sommers";
case 9, 10, 11:
break "Unser Herbst steht vor der Tür!";
case 12:
break "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
default:
break "Es gibt keinen solchen Monat";
};
System.out.println(message);
}
}
Auch ohne Standardeinstellung funktionierte es zur Kompilierungs- und Laufzeit fehlerfrei.
public class SwitchExpressionEnumSample {
private enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
}
public static void main(String[] args) {
var month = Month.values()[Integer.parseInt(args[0])];
var message = switch(month) {
case JANUARY, FEBRUARY -> "Es ist Winter";
case MARCH, APRIL, MAY -> "Es ist Frühling";
case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
};
System.out.println(message);
}
}
Es ist ein Muster, das unabhängig von dieser Version schon lange möglich war, aber ich habe mich gefragt, ob das obige Enum-Beispiel keinen Fall von Null enthält und von diesem abgedeckt werden kann.
public class SwitchExpressionNullSample {
private enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
}
public static void main(String[] args) {
Month month = null;
var message = switch(month) {
case JANUARY, FEBRUARY -> "Es ist Winter";
case MARCH, APRIL, MAY -> "Es ist Frühling";
case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
};
System.out.println(message);
}
}
Das Ergebnis war wie folgt. (Schleimig im Schalterteil (Monat)) Nun, das stimmt.
Exception in thread "main" java.lang.NullPointerException at SwitchExpressionNullSample.main(SwitchExpressionNullSample.java:11)
Das wesentliche Muster war undicht ... Kommentieren Sie es aus und sehen Sie, was passiert.
public class SwitchExpressionEnumSample {
private enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
}
public static void main(String[] args) {
var month = Month.values()[Integer.parseInt(args[0])];
var message = switch(month) {
case JANUARY, FEBRUARY -> "Es ist Winter";
case MARCH, APRIL, MAY -> "Es ist Frühling";
case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
// case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
};
System.out.println(message);
}
}
Die Ergebnisse sind wie folgt. Immerhin scheint es ein Kompilierungsfehler zu sein. Es ist hilfreich, weil es Fehler verhindert, die durch Lecks verursacht werden. Es scheint Ihnen nicht genau zu sagen, welches Element fehlt.
SwitchExpressionEnumSample.java:11: Fehler: Der Schalterausdruck deckt nicht alle möglichen Eingabewerte ab var message = switch(month) { ^
Java 13 wurde veröffentlicht, aber Funktionen im Switch-Stil bleiben in der Vorschau. Es gibt jedoch einige Änderungen in der Grammatik, daher werde ich sie hinzufügen.
Wenn Sie keine Pfeilsyntax oder keine Blöcke verwenden, wird der zurückzugebende Wert nach break beschrieben.
In Java 13 wurde geändert, um "Yield" anstelle von "Break" zu verwenden.
public class SwitchExpressionSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2 -> "Es ist Winter";
case 3, 4, 5 -> "Es ist Frühling";
case 6, 7, 8 -> {
yield "Der Höhepunkt des Sommers";
//↑ Dies
}
case 9, 10, 11 -> "Unser Herbst steht vor der Tür!";
case 12 -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
default -> "Es gibt keinen solchen Monat";
};
System.out.println(message);
}
}
Mit der Veröffentlichung von Java14 sind Schalterausdrücke zu einem formalen Merkmal geworden. Es scheint, dass sich die Spezifikationen von Java 13 nicht ändern werden.
Ich fand es bequem. (Konami) Sie können den durch das Auslassen von Unterbrechungen verursachten Fehler mithilfe der Pfeilsyntax verhindern und den durch das Auslassen von Wertemustern verursachten Fehler verhindern, indem Sie das Ergebnis des Schalterausdrucks so ersetzen, wie es ist. In der Vergangenheit gab es auch eine Technik, mit der Sie ohne Unterbrechung durchfallen konnten. Wenn Sie die Pfeilsyntax verwenden, können Sie dies nicht tun, aber ich denke, dass dies kein Problem darstellt, da Sie mehrere Fälle angeben können.
Recommended Posts