Java Language Annotations pour 'this' et paramètres du récepteur


Exemple

Lorsque les annotations Java ont été introduites pour la première fois, aucune disposition ne permettait d'annoter la cible d'une méthode d'instance ou le paramètre constructeur caché d'un constructeur de classes internes. Cela a été corrigé dans Java 8 avec l'ajout des déclarations de paramètres du récepteur ; voir JLS 8.4.1 .

Le paramètre récepteur est un périphérique syntaxique facultatif pour une méthode d'instance ou un constructeur de classe interne. Pour une méthode d'instance, le paramètre récepteur représente l'objet pour lequel la méthode est appelée. Pour un constructeur de classe interne, le paramètre receiver représente l'instance englobante immédiate de l'objet nouvellement construit. De toute façon, le paramètre récepteur existe uniquement pour permettre au type de l'objet représenté d'être désigné dans le code source, de sorte que le type puisse être annoté. Le paramètre du récepteur n'est pas un paramètre formel; plus précisément, il ne s’agit pas d’une déclaration de variable quelconque (§4.12.3), elle n’est jamais liée à une valeur passée en argument dans une expression d’invocation de méthode ou une expression de création d’instance de classe qualifiée, et elle n’a aucun effet sur temps d'exécution

L'exemple suivant illustre la syntaxe des deux types de paramètres du récepteur:

public class Outer {
    public class Inner {
        public Inner (Outer this) {
           // ...
        }
        public void doIt(Inner this) {
           // ...
        }
    }
}

Les paramètres du récepteur ont pour seul objectif d’ajouter des annotations. Par exemple, vous pouvez avoir une annotation personnalisée @IsOpen dont le but est d'affirmer qu'un objet Closeable n'a pas été fermé lorsqu'une méthode est appelée. Par exemple:

public class MyResource extends Closeable {
    public void update(@IsOpen MyResource this, int value) {
        // ...
    }

    public void close() {
        // ...
    }
}

À un @IsOpen niveau, l'annotation @IsOpen sur this @IsOpen pourrait simplement servir de documentation. Cependant, nous pourrions potentiellement faire plus. Par exemple:

  • Un processeur d’annotations peut insérer un contrôle d’exécution indiquant this n’est pas fermé lorsque la update à update est appelée.
  • Un vérificateur de code peut effectuer une analyse de code statique pour trouver des cas où this pourrait être fermé lorsque la update à update est appelée.