[JAVA] JDK12 qui vous donne l'impression de comprendre en 3 minutes

Calendrier de l'Avent Java 2018 Ceci est l'article du 14ème jour. JDK12 sortira l'année prochaine, voici donc quelques-uns des 12 changements.

Features JEP (JDK Enhancement Proposition) inclus dans JDK12 est le suivant Au 06/12/2018

89: Shenandoah: A Low-Pause-Time Garbage Collector   (Experimental) 230: Microbenchmark Suite 325: Switch Expressions (Preview) ** 326: Littéraux de chaîne bruts (aperçu) ** ← Peut être supprimé du JDK12 (mis à jour le 14/12/2018) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1

https://openjdk.java.net/projects/jdk/12/

Dans cet article, deux modifications apportées à la syntaxe Java ont eu un impact sur de nombreux programmeurs Java.

Je vais vous expliquer.

JEP325: Switch Expressions (Preview) C'est une spécification du projet Amber. Une représentation légèrement améliorée de la syntaxe de commutateur de Java.

Jusqu'à présent, la syntaxe du commutateur n'était pas intuitive car elle dépendait de l'ordre dans lequel les instructions break apparaissaient, et cela devenait la source de bogues potentiels.

//Changer de déclaration jusqu'à présent
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

Ce qui suit est une instruction de commutation améliorée

//Déclaration de commutation améliorée
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

Assez rafraîchi: détendu:

Affectation du cas à la variable

Un cas courant dans les instructions switch est l'affectation à une variable.

//Changer de déclaration jusqu'à présent
int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

Le processus d'affectation est écrit dans chaque cas, mais cela peut être écrit comme suit.

//Déclaration de commutation améliorée
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

En outre, vous pouvez écrire comme ça.

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY: break 6;
    case TUESDAY:                break 7;
    case THURSDAY, SATURDAY:     break 8;
    case WEDNESDAY:              break 9;
};

Modèle d'erreur

Certaines choses à surveiller

Cas 1

final int num = 3;
String str = switch(num) {
    case 1 -> "one";
    case 2 -> "two";
};

Cette façon d'écrire entraînera une erreur de compilation. Le message d'erreur est "l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles" En d'autres termes, couvrez toutes les valeurs possibles de l'argument switch en tant que branche conditionnelle du switch! C'est.

Dans ce cas, écrivez toutes les valeurs possibles de int au cas où à résoudre: rolling_eyes: (stupid Si vous écrivez par défaut à la place, la génération réussira.

final int num = 3;
String str = switch(num) {
    case 1 -> "one";
    case 2 -> "two";
    default -> "non";
};

Cas 2

final int num = 3;
String str = switch(num) {
    case 1: break "one";
    case 2 -> "two";
    default -> "non";
};

Cela entraîne également une erreur de compilation. Le message d'erreur est "différents types de cas utilisés dans le commutateur" Unifiez le style d'écriture! Cette.

326: Raw String Literals (Preview) La représentation des littéraux de chaîne est simplifiée. Lors de l'écriture de chemins d'URL, d'expressions régulières et de chaînes de caractères multilignes dans le code source, l'échappement et l'insertion de sauts de ligne réduisent la productivité et la lisibilité, mais vous êtes libéré de cette gêne.

Mettez la chaîne entre "` (guillemets arrière) "au lieu de" "(guillemets doubles)".

Exemple de chemin de fichier

Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
Runtime.getRuntime().exec(`"C:\Program Files\foo" bar`);

Exemple d'expression régulière

System.out.println("this".matches("\\w\\w\\w\\w"));
System.out.println("this".matches(`\w\w\w\w`));

Exemple multiligne

String html = "<html>\n" +
              "    <body>\n" +
              "		    <p>Hello World.</p>\n" +
              "    </body>\n" +
              "</html>\n";
String html = `<html>
                    <body>
                       <p>Hello World.</p>
                   </body>
               </html>
              `;

finalement

Les deux sont en état d'aperçu, il peut donc y avoir des changements à l'avenir, et je pense que JDK13 ou une version ultérieure peut être utilisé dans la production réelle (entreprise). Alors, profitez-en autant que vous pouvez toucher et jouer avec JDK12. De plus, si vous n'ajoutez pas l'option "--enable-preview" lors de la compilation et de l'exécution, une erreur se produira.

Recommended Posts

JDK12 qui vous donne l'impression de comprendre en 3 minutes
Une simple analogie des classes, instances et objets Java. .. .. [Série qui vous donne l'impression de comprendre]
[Pour les débutants] Vous comprendrez certainement en 10 minutes! Que sont les Java Beans?
Comprendre en 5 minutes !! Comment utiliser Docker
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap