Nouveauté de Java 1.4 et activées par défaut dans Java 5.0,
les assertions viennent combler un vide au sein des techniques
internes des débogages et de gestion d'exceptions, et permettent
aux développeurs de maîtriser les données qu'ils manipulent,
tant leur type que leur valeur.
Explication
La plupart des programmes sont conçus en sachant quel sera
le type et la valeur de la variable utilisée au sein, par
exemple, d'une boucle for() ou d'une fonction mathématique.
Cependant, tout comme il est recommandé de ne jamais utiliser
des données tierces sans les vérifier, la rigueur voudrait que
l'on s'assure de l'adéquation d'une valeur donnée pour une
méthode donnée.
Une assertion est décrite comme "une déclaration permettant
de tester ses exigences vis-à-vis du programme". Elles permettent
de placer des cas de figure selon lesquels
la variable serait acceptée ou rejetée. Les assertions autorisent
ainsi la mise en place d'une programmation "défensive", où
l'on pare aux problèmes de variable en annonçant au sein même
du programme ce que l'on souhaite utiliser (ou pas).
L'exemple canonique est celui d'un appel à la fonction mathématique
de calcul de racine carrée.
double resultat = Math.sqrt(x);
Pour que cette ligne réussisse, il faut que x soit positif.
Tout développeur doit être en mesure de savoir d'où provient
x, et donc ce qu'il contient, mais deux précautions valant
mieux qu'une, les assertions permettent d'ajouter une vérification.
Ainsi, une assertion correspond à une expression booléenne,
que le développeur déclare devoir être vraie pour qu'une routine
se lance.
Mise en place
Depuis Java 1.4, le développeur dispose donc d'outils pour
mettre en place des assertions : le mot-clé assert,
la classe AssertionError,
et de nouvelles méthodes au sein de la classe ClassLoader.
Nous en resterons pour le moment à assert.
Les assertions sont donc déclarées comme suit :
public class Bidouille() {
public void violette(int x) {
assert x > 0;
// ou bien
assert x > 0 : "x doit être supérieur
à 0";
System.out.println(x);
}
public static void main( String[] args ) {
Bidouille bidouille = new Bidouille();
bidouille.violette(1);
}
}
La seconde partie de la déclaration permet de passer un message
au gestionnaire d'assertions en cas de non-respect de l'assertion.
Ainsi, l'exemple le plus courant de l'usage d'assertion est
le suivant :
if (i % 3 == 0) {
...
}
else if (i % 3 == 1) {
...
}
else {
assert i % 3 == 2 : i;
...
}
où l'assertion remplace un possible commentaire que le développeur
aurait pu placer au même endroit. assert
évite ainsi de faire appel à un gestionnaire d'exception.
Cependant, elles n'ont en aucun cas été conçues pour remplacer
les exceptions, juste pour affiner le jugement des développeurs
sur une variable. Par ailleurs, le simple fait que seul Java
1.5 prend par défaut les assertions en compte (Java 1.4 nécessite
qu'on précise leur usage lors de la compilation, sinon il
ne les reconnaît pas, et les versions précédentes ne les connaissent
pas) fait qu'il est le plus souvent préférable de ne pas se
reposer totalement sur les assertions pour protéger son code.
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Plus largement, les assertions font partie intégrante de
ce que l'on appelle la "conception par contrat" (design by
contract), un concept venu du langage Eiffel qui met en
avant l'importance de contraintes spécifiées explicitement,
et qui doivent rester vraies une fois le programme lancé.
|