Package caseine.tags

Annotation Interface ToDoInConstructor


@Retention(RUNTIME) @Target(CONSTRUCTOR) public @interface ToDoInConstructor
Pour vider ou remplacer le contenu d'un constructeur.
Author:
Yvan Maillot <yvan.maillot@uha.fr>

L'annotation @caseine.tags.ToDoInConstructor

L'annotation @ToDoInConstructor permet de retirer le corps des constructeurs qu'elle annote ou de le remplacer par un autre code.

Cible

@ToDoInConstructor ne s'applique qu'aux constructeurs.

Formes d'emploi

@ToDoInConstructor s'emploie

  1. comme une annotation multivaluée : e.g. @ToDoInConstructor(value = "une consigne à l'étudiant", replacement = "{ this.x = 0.0; this.y = 0.0; }")
  2. comme une annotation monovaluée : e.g. @ToDoInConstructor("une consigne à l'étudiant")
  3. comme une annotation de marquage : @ToDoInConstructor

Effet

L'annotation @ToDoInConstructor a pour effet
  1. dans tous les cas, de conserver la signature du constructeur,
  2. et selon que la propriété replacement soit renseignée ou non:
    1. Si elle n'est pas renseignée (ou vide), de remplacer son contenu par un simple commentaire qui commence par // TODO suivi de la consigne à l'étudiant.
    2. Si elle est renseignée (et non vide), de remplacer le corps du constructeur par du code défini par la valeur de cette propriété (cf. Utilisation de la propriété replacement ci-après).

Utilisation de la propriété replacement

Sans renseigner la propriété replacement (c'est-à-dire par défaut), l'emploi de @ToDoInConstructor est assez naturelle.

En revanche, l'utilisation de la propriété replacement nécessite de prendre quelques précautions :

Le corps du constructeur est

  1. soit remplacé par le contenu d'un fichier dont le chemin est donné par la valeur de la propriété replacement, s'il s'agit du chemin d'un ficher accessible.
  2. soit remplacé par cette valeur elle-même sinon.

Attention, pour pouvoir déployer sur le serveur, il faut absolument que le code de remplacement soit parsable.

  • Il doit notamment commencer par { et finir par }
  • S'il contient des guillemets, ils devront être invalidés dans la valeur de la propriété (puisqu'elle est elle-même entre guillemets).
    Par exemple, pour produire { this.name = ""; }, il faut écrire replacement="{ this.name = \"\"; }"
  • Ça peut devenir compliqué s'il faut ajouter des sauts de lignes ('\n'), des tabulations ('\t'), des caractères unicode, etc.
    Dans ces cas, et le plus souvent, l'emploi d'un fichier externe est préférable.

Exemple d'annotation de marquage

 @ToDoInConstructor
 public Point(double x, double) {
    this.x = y;
    this.y = y;
 }
 

sera remplacé par

 public Point(double x, double) {
 // TODO
 }
 

Exemple d'annotation monovaluée

 @ToDoInConstructor("Écrire ce constructeur")
 public Point(double x, double) {
    this.x = y;
    this.y = y;
 }
 

sera remplacé par

 public Point(double x, double) {
 // TODO Écrire ce constructeur
 }
 

Exemple d'annotation multivaluée (sans fichier)

 @ToDoInConstructor(value="Ce constructeur est mal écrit. Corrigez-le !", replacement = "{ this.x = 0.0; this.y = 0.0; }")
 public Point() {
    this(0.0, 0.0);
 }
 

sera remplacé par

 public Point() {
    this.x = 0.0;
    this.y = 0.0;
 // TODO Ce constructeur est mal écrit. Corrigez-le !
 }
 
*

Exemple d'annotation multivaluée (avec fichier)

 @ToDoInConstructor(replacement = "aConstructorReplacementFile.txt")
 public Point(double x, double y) {
    this.x = x;
    this.y = y;
 }
 
si le fichier "aConstructorReplacementFile.txt" contient
 {
    x = x;
    y = y;
    // Corrigez ce code !
 }
 

Attention les accolades sont nécessaires.

sera remplacé par

 public Point(double x, double y) {
    x = x;
    y = y;
 // Corrigez ce code !
 }
 

Remarque : les commentaires de la javadoc sont toujours conservés.

Précautions

@ToDoInConstructor peut livrer à l'étudiant un code non compilable. Par exemple si le constructeur annoté affecte des attributs déclarés final.

Il faut donc l'utiliser en connaissance de cause.

  • Optional Element Summary

    Optional Elements
    Modifier and Type
    Optional Element
    Description
    Définit le remplacement du corps du constructeur annotée.
    Définit la consigne à destination de l'étudiant.
  • Element Details

    • value

      String value
      Définit la consigne à destination de l'étudiant. Elle sera dans le corps du constructeur et précédée de // TODO Par défaut, la consigne est vide.
      Returns:
      La consigne à destination de l'étudiant.
      Default:
      ""
    • replacement

      String replacement
      Définit le remplacement du corps du constructeur annotée.
      Returns:
      une chaîne de caractères qui est
      1. soit la chaîne vide (par défaut)
      2. soit le chemin valide d'un fichier qui contient le code à remplacer
      3. soit le code lui-même

      Attention ce code doit être compilable.

      Default:
      ""