Assertions Java : guide pratique pour détecter les bugs et assurer la fiabilité du code
Assertions Java
Apprenez comment l'instruction assert de Java peut vous aider à attraper les bugs tôt, valider les hypothèses et améliorer la qualité du code.
Les assertions sont un mécanisme léger, réservé aux développeurs, pour tester des conditions qui devraient toujours être vraies pendant l'exécution. Elles sont activées explicitement et omises des builds de production, donc elles n'affectent jamais la performance d'exécution.
Syntaxe
assert condition;
Ici condition est une expression booléenne que vous vous attendez à évaluer à true. Si la condition est false et que les assertions sont activées, la JVM lance une AssertionError et arrête le programme.
Activation des assertions
Les assertions sont désactivées par défaut. Activez-les avec l'option JVM :
java -ea:arguments java -enableassertions:arguments
Quand activées, une condition true continue normalement ; une condition false déclenche une AssertionError et stoppe l'exécution.
Exemple 1 : Assertion basique
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("There are " + weekends.length + " weekends in a week"); } }
Sortie avec assertions désactivées :
There are 3 weekends in a week
En activant les assertions, on obtient :
Exception in thread "main" java.lang.AssertionError
Syntaxe d'assertion étendue
Incluez un message diagnostique avec :
assert condition : expression;
L'expression est passée au constructeur de AssertionError et affichée si la condition échoue.
Exemple 2 : Assertion avec message
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length==2 : "There are only 2 weekends in a week"; System.out.println("There are " + weekends.length + " weekends in a week"); } }
Sortie quand activé :
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Activation d'assertions ciblée
Activez les assertions pour des classes ou packages spécifiques :
- Toutes les classes utilisateur :
java -ea - Classe spécifique :
java -ea:AnimalClass Main - Package et sous-packages :
java -ea:com.animal... Main - Packages sans nom :
java -ea:... Main
Les classes système peuvent être activées avec -esa ou -enablesystemassertions. La désactivation suit un motif similaire avec -da et -dsa.
Quand les assertions sont précieuses
- Code inatteignable : Vérifier que le code marqué inatteignable l'est vraiment.
void unreachableCodeMethod() { System.out.println("Reachable code"); return; // Code inatteignable System.out.println("Unreachable code"); assert false; } - Branches default manquantes : Assurer un traitement exhaustif dans les instructions switch.
switch (dayOfWeek) { case "Sunday": System.out.println("It's Sunday!"); break; case "Monday": System.out.println("It's Monday!"); break; // … default: assert false : dayOfWeek + " is an invalid day"; } - Documentation d'hypothèses : Remplacer les commentaires fragiles par des instructions assert pour qu'elles restent synchronisées.
if (i % 2 == 0) { // ... } else { assert i % 2 == 1 : i; // ... }
Quand ne pas utiliser les assertions
- Vérifications d'arguments d'API publique : Les entrées fournies par l'utilisateur devraient déclencher des exceptions d'exécution, pas des erreurs d'assertion.
- Conditions avec effets de bord : Évitez d'appeler des méthodes qui modifient l'état dans une assertion, car le code peut s'exécuter silencieusement quand les assertions sont désactivées.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday" )); boolean removed = weekdays.removeAll(weekends); assert removed;
Bénéfices des assertions
- Détection rapide de bugs centrée développeur.
- Supprimées automatiquement dans les builds de production, assurant un coût d'exécution nul.
- Réduit le boilerplate et clarifie l'intention.
- Augmente la confiance pendant le refactoring et l'optimisation.
Java
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Commentaires Java : Types, utilisation et bonnes pratiques
- Maîtriser la boucle for améliorée en Java : Syntaxe, exemples et bonnes pratiques
- Maîtriser les chaînes de caractères en Java : Création, méthodes et bonnes pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée
- Annotations Java expliquées : types, placement et exemples pratiques
- Comprendre Java Vector : Utilisation, Fonctionnalités et Comparaison avec ArrayList