web-dev-qa-db-fra.com

Assert mot-clé en Java

Utilisez-vous le mot clé assert ou émettez-vous une exception d'exécution de validation? Quels avantages cela vous apporte-t-il ou pourquoi pensez-vous que son utilisation n'en vaut pas la peine?

38
Stan Kurilin

Assert générera une erreur d'exécution ( AssertionError ) si sa condition est false. Les assertions vous offrent un moyen simplifié de documenter, vérifier et appliquer des critères de correction pour votre code. Les avantages sont un crochet de niveau de langue pour définir et manipuler ces conditions de correction. Dans la mesure où vous souhaitez les activer ou les désactiver (il existe des arguments sur le point de savoir si c'est une bonne idée ou non), vous pouvez le faire à partir de la ligne de commande de la machine virtuelle Java. Certains commentateurs ci-dessous notent que les assertions sont désactivées par défaut sauf si elles sont exécutées en mode débogage; ma pratique est d'ajouter "-ea" (activer les assertions) dans mes scripts d'encapsuleur à tout moment. Même dans les codes sensibles à la performance, le compromis pèse pour moi en faveur de la confiance en la sécurité/exactitude que me procurent les affirmations. Assertions at Oracle et Description de l'API pour AssertionError

Notez la distinction entre les échecs attendus ou inattendus (exceptions), qui peuvent être en dehors de votre contrôle, et les échecs d'assertion - les assertions d'assertions documentent les hypothèses du programmeur, et indiquent un programme incorrect plutôt qu'une condition externe inattendue ou attendue. Si un échec d'assertion se produit, l'interprétation est que le programmeur a mal compris ou a incorrectement exprimé le programme, plutôt que d'autres sources d'erreur ou d'échec. 

En pratique, je l’utilise pour documenter les hypothèses évidentes ou non évidentes que je fais et les invariants que je veux appliquer lorsque je produis du code (en particulier privé/interne), en expliquant clairement à moi-même et aux autres pourquoi ces hypothèses sont faites, où elles se trouvent. réalisés et qu’ils soient ou non validés. Bien mieux que des commentaires allant dans le même sens. C’est un (petit) pas vers Conception par contrat .

L'élément Java effectif n ° 38 "Vérification des paramètres de validité" ( Google Livres , Amazon.com ) fournit une présentation utile de la distinction entre vérification des paramètres et utilisation appropriée des assertions.

Lié à SO: ( Activation des assertions dans netbeans ), ( Assertions vs. Exceptions ), ( Quasi-duplicata, demandant des exemples ), ( Nom incorrect, mais contenu très similaire )

60
andersoj

Quels avantages vous procure-t-il ou pourquoi pensez-vous que son utilisation n'en vaut pas la peine?

Utiliser des assertions pour les vérifications obligatoires, comme d'autres l'ont recommandé, est une pratique dangereuse

Que se passe-t-il lorsqu'un autre développeur utilise votre bibliothèque? Ou bien un administrateur système ou un utilisateur privilégié oublie, ou pire ne sait pas, d'activer les assertions avec l'indicateur -ea au moment de l'exécution? Vous perdez tous ces chèques, c'est quoi.

Les assertions sont un outil de développement. Le fait que l'état par défaut du drapeau soit off est un don mort. 

Aucune caractéristique ou avantage dans votre application ne devrait jamais dépendre d'une affirmation.

En arrière-plan, les assertions sont utilisées de la même manière en C/C++, d'où la fonctionnalité a été prise. En C/C++, un développeur peut généralement transmettre un #define DEBUG ... lors de la compilation pour activer ou désactiver les assertions. Avec le code de production C/C++, cette fonctionnalité est généralement désactivée.

Conceptuellement, la même chose devrait être vraie pour Java. En conditions d'utilisation de production et d'exceptions. Ils sont essentiellement la même chose.

3
kervin

andersoj est correct. Juste pour que vous sachiez, l’atout majeur des affirmations est que vous pouvez simplement le désactiver (si vous ne passez pas le pas en ligne de commande Java). Cette chose simple les rend parfaits pour une utilisation en développement, lorsque vous voulez être sûr de ne pas casser votre propre code.

3
Plínio Pantaleão

Pour être précis sur votre question: 

Assert est utilisé pour valider la condition d'une instruction.

assert (some condition)
Example : assert (6 < 7) // condition pass
          assert (6 > 7) // throws AssertionException here

La plupart des gens utilisent assert pour le cas d'utilisation suivant pour String: (mais personnellement, je n'aime pas utiliser assert pour cela):

assert (obj != null || obj.isEmpty() || ... )

J'aime plutôt utiliser google goyave, qui est propre et a un but précis:

Obj.isNullOrEmpty()

Plus d'infos: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html