TUTORIEL JAVA 
Java : les assertions
Elles viennent combler un vide au sein des techniques internes des débogages et de gestion d'exceptions en permettant de spécifier si une variable est bien ce que l'on voudrait qu'elle soit. (26/01/2005)

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é.

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages