Résumé des mots réservés Java inconnus de manière inattendue

Aperçu

Les mots réservés Java vont de ceux que vous voyez souvent à ceux que vous ne voyez pas très souvent. Je présenterai brièvement les rares mots réservés que j'ai choisis en fonction de mon propre jugement et de mes préjugés.

Je n'entrerai pas trop dans les détails sur chacun d'eux pour que cela ne devienne pas trop long.

Selon les spécifications du langage Java, les «mots réservés» sont appelés «mots-clés». Je pense que les «mots réservés» sont plus courants, je vais donc utiliser le terme «mots réservés» dans cet article.

Public cible

Débutant Java Il peut être connu de ceux qui connaissent Java dans une certaine mesure (ligne de prévention)

environnement

Java11

Liste des mots réservés en Java

Jetons d'abord un œil à la liste des mots réservés. Selon la spécification de langue officielle, à partir de Java 11, il y a 51 mots réservés comme suit. https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.9

abstract   continue   for          new         switch
assert     default    if           package     synchronized
boolean    do         goto         private     this
break      double     implements   protected   throw
byte       else       import       public      throws
case       enum       instanceof   return      transient
catch      extends    int          short       try
char       final      interface    static      void
class      finally    long         strictfp    volatile
const      float      native       super       while
_ (underscore)

Je vais en prendre quelques-uns et les présenter.

Mot réservé (mot-clé)

assert Un mot réservé pour utiliser l'assertion en Java. Une expression décrit les prérequis à remplir lors de l'exécution d'un programme, et sans crainte de malentendu, cela semble être un mécanisme pour vérifier si la valeur d'une variable est une valeur inattendue, etc. C'est une chose.

Écrivez une expression conditionnelle après assert, et si la valeur d'évaluation de l'expression conditionnelle est false, une AssertionError sera levée. Par exemple, il peut être utilisé pour vérifier si la valeur de l'argument de la méthode est la valeur attendue.

//division
private int divide(int x, int y) {
    assert y != 0;  //Y ne doit pas être 0 car il s'agit d'une division

    return x / y;
}

De plus, les assertions ne prendront effet que si vous spécifiez -enableassertions (ou -ea) au moment de l'exécution. Vous pouvez l'activer ou le désactiver en passant l'option ci-dessus. Il peut être activé pendant le développement et désactivé pendant la production.

const En langage C, etc., c'est un mot réservé pour déclarer une constante, mais en Java c'est un mot réservé qui n'a pas de sens. Cela ne veut rien dire, mais il existe en tant que mot réservé pour une raison quelconque. L'utilisation de const n'a aucune signification syntaxique et entraînera une erreur de compilation.

Notez que vous devez utiliser final au lieu de const pour déclarer une constante en Java.

//Comme il s'agit d'un mot réservé, la coloration syntaxique est effectuée
const int num = 1;
//Erreur:
//Début d'expression illégal
//  const int num = 1;
//  ^

default C'est un mot réservé rare qui a de multiples usages. Il a été ajouté au fur et à mesure que la version montait.

Exemple d'instruction Switch

switch(i) {
    case 1:
        System.out.println("un");
        break;
    case 2:
        System.out.println("deux");
        break;
    default:
        System.out.println("Autre");
}

Exemple d'annotation

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Range {

    int min() default Integer.MIN_VALUE;

    int max() default Integer.MAX_VALUE;
}

Exemple de méthode d'interface par défaut

public interface Person {
    default String name() {
        return "unknown";
    }
}

goto En langage C, etc., c'est un mot réservé utilisé pour sauter le contrôle à n'importe quel endroit, mais comme const, c'est un mot réservé qui existe même s'il n'a aucune signification en Java. Java n'a pas de fonction équivalente à goto. L'abus de goto peut réduire considérablement la lisibilité du code source, il n'y a donc souvent pas de fonctionnalité équivalente dans des langages relativement modernes.

Comme avec const, il s'agit bien sûr d'une erreur de compilation lorsqu'il est utilisé.

//Une fois que toute la mise en évidence de la syntaxe est terminée
goto label;
//Erreur:
//Début d'expression illégal
//  goto label;
//  ^

native Un mot réservé qui indique que le contenu de la méthode est implémenté dans une langue native telle que C. Il est exécuté en utilisant JNI etc.

public native boolean createDirectory(File f);

strictfp Il s'agit d'un mot réservé pour empêcher le résultat du calcul en virgule flottante de changer en fonction de l'environnement d'exécution (afin que le résultat soit le même dans tous les environnements d'exécution). Qualifiez les méthodes et les classes. À l'inverse, si vous ne remplissez pas les conditions requises avec strictfp, le résultat du calcul en virgule flottante peut changer en fonction de l'environnement d'exécution.

Personnellement, je ne l'ai jamais vu réellement utilisé.

private strictfp double calc(double x, double y) {
    return x * y;
}

transient Les champs qualifiés sont exclus de la sérialisation. La sérialisation est la conversion du contenu d'un objet afin qu'il puisse être enregistré dans un fichier ou envoyé vers une autre machine. En se qualifiant avec transitoire, le champ pertinent est exclu des données sérialisées.

public class Person implements Serializable {
    private String firstName;
    private String lastName;
    private transient String fullName;
}

volatile Supprime l'optimisation d'hypothèse monothread pour les champs qualifiés. Je suis sûr que certains d'entre vous l'ont vu, mais je ne sais pas ce que cela signifie. Je ne suis pas sûr non plus. </ s>

S'il n'est pas qualifié avec volatile, le compilateur peut générer des bytecodes légèrement différents de la source pour l'optimisation, mais volatile supprime cette optimisation. Dans le cas d'un thread unique, il n'y a pas d'effet particulier, mais dans le cas du multithread, une incohérence peut se produire en raison de l'optimisation par le compilateur. Volatile est utilisé pour empêcher l'apparition de telles incohérences.

volatile boolean shutdownRequested;
 
...
 
public void shutdown() { shutdownRequested = true; }
 
public void doWork() { 
    while (!shutdownRequested) { 
        // do stuff
    }
}

Depuis https://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html

Dans l'exemple ci-dessus, nous nous attendons à ce que shutdown () sorte de la boucle lorsqu'il est appelé par un autre thread, mais il peut ne pas fonctionner comme prévu à moins que shutdownRequested ne soit qualifié avec volatile.

… C'était censé l'être, mais quand je l'ai essayé, ça fonctionnait normalement même sans volatile. S'il vous plaît dites-moi qui le connaît! </ font>

_(underscore) Dans des langages tels que Scala, _ est utilisé pour les espaces réservés, etc., mais Java n'a pas une telle fonctionnalité. Comme const et goto, c'est un mot réservé sans signification (symbole?). _ Est devenu un mot réservé relativement récemment avec Java 9, et peut être en prévision d'améliorations futures.

int _ = 1;
//Erreur:
//À partir de la version 9'_'Est un mot-clé et ne peut pas être utilisé comme identifiant
//  int _ = 1;
//      ^

Édition supplémentaire

Des mots réservés qui existaient autrefois

widefp À l'opposé de strictfp, le résultat du calcul en virgule flottante devient dépendant de l'environnement. Widefp a été supprimé car il se comporte désormais comme ça par défaut.

Quelque chose qui ressemble à un mot réservé mais qui n'est pas un mot réservé

littéral

vrai et faux

C'est un littéral booléen familier. En fait, ce ne sont pas des mots réservés dans la spécification du langage Java. Eh bien, il ne peut pas être utilisé comme identifiant, donc c'est en fait comme un mot réservé.

null C'est un littéral nul familier. Comme le littéral booléen, il ne peut pas être utilisé comme identificateur, mais ce n'est pas un mot réservé dans les spécifications du langage.

Mot clé restreint

open, module, requires, transitive, exports, opens, to, uses, provides, with Les deux ont été ajoutés dans Java 9 pour la fonctionnalité du module. Si vous prenez chacun d'eux, ce sera long et je ne comprends pas bien </ s>, donc je vais omettre l'explication. Les deux sont des mots qui ont une signification particulière, mais ils peuvent être utilisés comme noms de variables. Probablement pour la compatibilité.

String module = "module";

Nom du type réservé

var Utilisé pour la fonctionnalité d'inférence de type ajoutée à partir de Java 10. Cela a également une signification spéciale comme les "mots clés restreints" ci-dessus, mais il peut être utilisé comme nom de variable, etc. Ce n'est peut-être pas un mot réservé pour la compatibilité.

var var = 1;

Résumé

J'ai vu beaucoup de choses, des mots réservés Java à des choses qui ressemblent à des mots réservés mais ne sont pas des mots réservés. Je serais heureux si vous pouviez penser qu'il y avait une telle chose.

Lien de référence

https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.9 https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89_(Java) https://java.keicode.com/lang/assert.php https://www.wdic.org/w/TECH/strictfp https://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html https://www.wdic.org/w/TECH/%E4%BA%88%E7%B4%84%E8%AA%9E%20%28Java%29