Annotation Interface ToDoInConstructor
- 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
- comme une annotation multivaluée : e.g. @ToDoInConstructor(value = "une consigne à l'étudiant", replacement = "{ this.x = 0.0; this.y = 0.0; }")
- comme une annotation monovaluée : e.g. @ToDoInConstructor("une consigne à l'étudiant")
- comme une annotation de marquage : @ToDoInConstructor
Effet
L'annotation @ToDoInConstructor a pour effet- dans tous les cas, de conserver la signature du constructeur,
- et selon que la propriété replacement soit renseignée ou
non:
- 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.
- 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
- 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.
- 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 ElementsModifier and TypeOptional ElementDescriptionDéfinit le remplacement du corps du constructeur annotée.Définit la consigne à destination de l'étudiant.
-
Element Details
-
value
String valueDé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 replacementDéfinit le remplacement du corps du constructeur annotée.- Returns:
- une chaîne de caractères qui est
- soit la chaîne vide (par défaut)
- soit le chemin valide d'un fichier qui contient le code à remplacer
- soit le code lui-même
Attention ce code doit être compilable.
- Default:
- ""
-