web-dev-qa-db-fra.com

Y a-t-il une différence entre BigDecimal ("0") et BigDecimal.ZERO?

Que ce soit pour des comparaisons ou pour l'initialisation d'une nouvelle variable, est-ce que cela fait une différence laquelle de celles que vous utilisez?

Je sais que BigDecimal.ZERO est une fonctionnalité 1.5, c'est donc un problème, mais en supposant que j'utilise 1.5, est-ce important?

Merci.

26
MattGrommes

BigDecimal.ZERO Est une constante prédéfinie et n'a donc pas besoin d'être évaluée à partir d'une chaîne au moment de l'exécution comme le serait BigDecimal("0"). Ce sera plus rapide et ne nécessitera pas la création d'un nouvel objet.

Si votre code doit s'exécuter sur une version antérieure à la version 1.5, vous pouvez utiliser le modèle Singleton (très critiqué) pour créer un objet équivalent à BigDecimal.ZERO. La première fois qu'il est utilisé, il appellerait BigDecimal("0") pour créer un objet zéro et retournerait cet objet lors des appels suivants. Sinon, si votre code s'exécute sur un système 1.5, votre objet singleton peut simplement renvoyer BigDecimal.ZERO Sans pénalité d'exécution.

36
Greg Hewgill

L'utilisation de ZERO ne crée pas de nouvel objet et ne nécessite aucune analyse. Certainement la voie à suivre.

14
Jon Skeet

Avant de parler des pénalités d'exécution, assurez-vous que ce morceau de code compte. Configurez le profilage et mesurez le cas d'utilisation complet.

Néanmoins, préférez Bigdecimal.ZERO Car il est vérifié au moment de la compilation alors que vous pouvez accidentellement taper new BigDecimal("9"), ce que le compilateur acceptera, mais qui provoquera des bogues dans votre application.

4
ordnungswidrig

Par curiosité, j'ai vérifié auprès du constructeur pour BigDecimal et il n'a aucune optimisation pour la chaîne "0". Alors certainement oui, il y a une différence.

3
Allain Lalonde