web-dev-qa-db-fra.com

Utilisation correcte Java mot clé "assert"

Je n'ai jamais compris à quoi sert assert, même si j'ai lu de nombreux exemples, ils ne me permettent pas vraiment de savoir pourquoi ou pourquoi je dois l'utiliser.

Donc, au lieu de demander un exemple, je vais en fournir un et me faire savoir si c'est la bonne utilisation de assert.

// The idea is that the `mode` variable should be 0 or 1, and no other number.
switch(mode) {
     case 0: 
          // do stuff
          break;
     case 1:
          // do other stuff
          break;

     default:
          // assert code?
}

Si cela est correct, veuillez me faire savoir comment l'utiliser dans ce cas. Si ce n'est pas ainsi qu'il est censé être utilisé, veuillez fournir un exemple.

15

Pas dans ce cas.

Si vous affirmez une valeur, vous déclarez qu'avant d'effectuer une évaluation critique à l'aide de cette valeur, c'est ce que vous affirmez être. Vous pouvez affirmer que la valeur n'est pas nulle, ou qu'elle est inférieure à 2, ou quelque chose avant vous atteignez votre bloc de code critique.

assert (mode >= 0 && mode < 2);  // Ensures that `mode` is between 0 and 1.
// Switch statement to follow

Je n'encouragerais pas l'utilisation de cela ici. Votre code ne serait pas bien lu et à moins que vous n'activiez des assertions avec le -ea flag, votre assertion ne fonctionnerait pas.

Au lieu de cela, ce que vous pouvez faire est de lever une exception quelconque - si ce n'est pas 0 ou 1, alors le mode est une valeur illégale qui ne peut pas être traitée, conduisant à un comportement exceptionnel/indéfini. Jetez une exception quelconque.

switch(mode) {
    case 0: 
        // do stuff
        break;
    case 1:
        // do other stuff
        break;
    default:
      throw new IllegalArgumentException("Mode is illegal");
}
19
Makoto
assert object != null;
object.doSomething();

assert est utilisé pour vérifier l'exactitude de certaines conditions préalables, invariantes ou postconditionnelles. Dans l'exemple, nous voulons nous assurer que object n'est pas null lorsqu'une méthode est appelée dessus.

Une chose à retenir est que assert ne doit jamais être exécuté dans le code de production. Nous ne l'utilisons que lors des tests. Il existe une option Java pour l'activer ou la désactiver).

Quant à votre exemple spécifique, vous pouvez utiliser:

assert mode == 0;
assert mode == 1;

au tout début du bloc de commutation pour vous assurer que 0 et 1 sont passés.

P.S. La discussion sur quand utiliser assertion vs exception pourrait vous aider à comprendre. L'idée est que

Les exceptions concernent la robustesse de votre application tandis que les assertions concernent l'exactitude de votre application.

8
Terry Li

Les assertions sont essentiellement utilisées pour vérifier quelque chose qui ne devrait jamais se produire. Certaines assertions utilisent des cas de http://www.javapractices.com/topic/TopicAction.do?Id=102

conditions préalables (dans les méthodes privées uniquement) - les exigences qu'une méthode exige que son appelant remplisse. post-conditions - vérifier les promesses faites par une méthode à ses invariants de classe d'appel - valider le code d'état de l'objet inaccessible lors de l'exécution - parties de votre programme que vous pensez être inaccessibles, mais qui ne peuvent pas être vérifiées en tant que telles au moment de la compilation ( souvent autres clauses et cas par défaut dans les instructions switch)

Donc, l'utilisation de l'assertion dans votre code n'est pas correcte

4
Rami