Java 12 est sorti. Je pense qu'il y a divers changements et nouvelles fonctions, mais j'ai essayé l'instruction switch (ou expression switch), qui est le changement le plus évident.
La façon d'écrire une nouvelle instruction switch semble être positionnée comme une fonction de prévisualisation à partir de Java 12, et vous devez ajouter des options au moment de la compilation et de l'exécution.
Au moment de la compilation
javac --enable-preview --release 12 MultiCaseSample.java
Durée
java --enable-preview MultiCaseSample
De plus, le contenu écrit ici est sujet à changement à l'avenir.
Vous pouvez spécifier plusieurs valeurs dans la clause case, séparées par des virgules.
public class MultiCaseSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
switch(month) {
case 1, 2:
System.out.println("C'est l'hiver");
break;
case 3, 4, 5:
System.out.println("C'est le printemps");
break;
case 6, 7, 8:
System.out.println("Le summum de l'été");
break;
case 9, 10, 11:
System.out.println("Notre automne approche à grands pas!");
break;
case 12:
System.out.println("C'est la fin de l'année, donc je vais commencer l'année prochaine");
break;
default:
System.out.println("Il n'y a pas de mois pareil");
}
}
}
Écrivez la phrase après le symbole "->". Vous pouvez omettre la description des deux points et de la rupture. Il semble que vous puissiez écrire un traitement multiligne en utilisant des blocs. (Dans l'exemple ci-dessous, c'est une ligne ...) De plus, vous n'avez pas besoin d'un point-virgule après la parenthèse fermant le bloc.
public class ArrowSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
switch(month) {
case 1, 2 -> System.out.println("C'est l'hiver");
case 3, 4, 5 -> System.out.println("C'est le printemps");
case 6, 7, 8 -> System.out.println("Le summum de l'été");
case 9, 10, 11 -> System.out.println("Notre automne approche à grands pas!");
case 12 -> System.out.println("C'est la fin de l'année, donc je vais commencer l'année prochaine");
default -> {
System.out.println("Il n'y a pas de mois pareil");
}
}
}
}
L'instruction switch est désormais une expression switch. La différence entre les instructions et les expressions est que la première ne renvoie pas de valeur, tandis que la seconde renvoie une valeur. Ainsi, vous pouvez affecter le résultat de l'évaluation de l'expression de commutateur à la variable telle quelle. Dans ce cas, un point-virgule est requis après la parenthèse fermante du commutateur.
De plus, si tous les modèles ne sont pas couverts (dans cet exemple, il n'y a pas de clause par défaut), une erreur de compilation se produira. C'est mieux que d'attribuer implicitement null. Si vous n'utilisez pas la syntaxe de la flèche ou n'utilisez pas de blocs, la valeur à renvoyer est décrite après break.
public class SwitchExpressionSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2 -> "C'est l'hiver";
case 3, 4, 5 -> "C'est le printemps";
case 6, 7, 8 -> {
break "Le summum de l'été";
}
case 9, 10, 11 -> "Notre automne approche à grands pas!";
case 12 -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
default -> "Il n'y a pas de mois pareil";
};
System.out.println(message);
}
}
Apparemment, mélanger la syntaxe des flèches avec la syntaxe traditionnelle entraîne une erreur de compilation. J'ai donc écrit un modèle qui n'utilise pas la syntaxe des flèches séparément.
public class SwitchExpressionBreakSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2:
break "C'est l'hiver";
case 3, 4, 5:
break "C'est le printemps";
case 6, 7, 8:
break "Le summum de l'été";
case 9, 10, 11:
break "Notre automne approche à grands pas!";
case 12:
break "C'est la fin de l'année, donc je vais commencer l'année prochaine";
default:
break "Il n'y a pas de mois pareil";
};
System.out.println(message);
}
}
Même sans valeur par défaut, cela a fonctionné sans aucune erreur au moment de la compilation et de l'exécution.
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 -> "C'est l'hiver";
case MARCH, APRIL, MAY -> "C'est le printemps";
case JUNE, JULY, AUGUST -> "Le summum de l'été";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
};
System.out.println(message);
}
}
C'est un modèle qui est possible depuis longtemps quelle que soit cette version, mais dans l'exemple Enum ci-dessus, il n'y a pas de cas où il est nul, et je me demandais s'il peut être dit qu'il est couvert.
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 -> "C'est l'hiver";
case MARCH, APRIL, MAY -> "C'est le printemps";
case JUNE, JULY, AUGUST -> "Le summum de l'été";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
};
System.out.println(message);
}
}
Le résultat était le suivant. (Slimy dans la partie commutateur (mois)) Eh bien, c'est vrai.
Exception in thread "main" java.lang.NullPointerException at SwitchExpressionNullSample.main(SwitchExpressionNullSample.java:11)
Le motif essentiel fuyait ... Commentez-le et voyez ce qui se passe.
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 -> "C'est l'hiver";
case MARCH, APRIL, MAY -> "C'est le printemps";
case JUNE, JULY, AUGUST -> "Le summum de l'été";
case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
// case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
};
System.out.println(message);
}
}
Les résultats sont les suivants. Après tout, cela semble être une erreur de compilation. C'est utile car cela empêche les bogues causés par les fuites. Il ne semble pas vous dire exactement quel élément manque.
SwitchExpressionEnumSample.java:11: Erreur: l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles var message = switch(month) { ^
Java 13 a été publié, mais les fonctionnalités de style Switch restent en préversion. Cependant, il y a quelques changements dans la grammaire, je vais donc l'ajouter.
Si vous n'utilisez pas la syntaxe des flèches ou n'utilisez pas de blocs, la valeur à renvoyer est décrite après break.
Changé dans Java 13 pour utiliser yield
au lieu de break
.
public class SwitchExpressionSample {
public static void main(String[] args) {
var month = Integer.parseInt(args[0]);
var message = switch(month) {
case 1, 2 -> "C'est l'hiver";
case 3, 4, 5 -> "C'est le printemps";
case 6, 7, 8 -> {
yield "Le summum de l'été";
//↑ Ce
}
case 9, 10, 11 -> "Notre automne approche à grands pas!";
case 12 -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
default -> "Il n'y a pas de mois pareil";
};
System.out.println(message);
}
}
Avec la sortie de Java14, les expressions de commutation sont devenues une fonctionnalité formelle. Il semble que les spécifications ne changeront pas à partir de Java 13.
J'ai pensé que c'était pratique. (Konami) Vous pouvez empêcher le bogue provoqué par l'omission de rupture en utilisant la syntaxe de la flèche et vous pouvez empêcher le bogue causé par l'omission du modèle de valeur en remplaçant le résultat de l'expression de commutateur tel quel. De plus, dans le passé, il existait une technique pour vous laisser tomber sans écrire de pause, et si vous utilisez la syntaxe de la flèche, vous ne pouvez pas le faire, mais je pense que ce ne sera pas un problème car vous pouvez spécifier plusieurs cas.