web-dev-qa-db-fra.com

BigDecimal.ZERO contre le nouveau BigDecimal (0). Lequel utiliser et pourquoi?

Je me demandais si ces deux étaient les mêmes. Quelqu'un peut-il vérifier? (J'essaye de remplacer le 1er par le 2ème)

BigDecimal totalCurrentSales = new BigDecimal(0);

et

BigDecimal totalCurrentSales = BigDecimal.ZERO;

La raison pour laquelle je demande est qu'il est incorrect de le déclarer de la première façon car vous n'êtes pas censé créer des instances de BigInteger et BigDecimal (ZERO, ONE, TEN) déjà existantes. Je me demandais donc si je pouvais le dire de la deuxième façon et qu'il serait toujours envisagé de créer une instance. Au lieu de devoir créer une variable zero ou quelque chose qui est égal à BigDecimal.ZERO. Ou existe-t-il d'autres moyens?

J'ai essayé

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

mais Eclipse n'était pas trop content.

23
erp

Mathématiquement, ce sont les mêmes. De plus, puisque les BigDecimals sont immuables, vous n'avez pas à vous soucier de créer de nouvelles instances pour effectuer de nouveaux calculs. Dès que vous effectuez une opération sur votre instance totalCurrentSales, vous allez en fait créer un nouveau BigDecimal et réaffecter la référence totalCurrentSales à la nouvelle valeur.

Du point de vue de l'instanciation, ils ne sont pas nécessairement exactement les mêmes. Dans l'implémentation OpenJDK 6b14, par exemple, BigDecimal.ZERO Est créé en appelant le constructeur privé new BigDecimal(BigInteger, long, int) avec les valeurs BigInteger.ZERO, 0 Et 0.

Du point de vue de la qualité du code, l'utilisation de BigDecimal.ZERO Est préférable à new BigDecimal(0) car vous évitez l'instanciation supplémentaire et un littéral dans votre code.

32
bdkosher

BigDecimal n'a pas de constructeur qui prend un BigDecimal comme argument, ce qui explique pourquoi Eclipse ne serait pas satisfait de cela.

BigDecimal est immuable, ce qui signifie qu'une fois que vous créez un objet, son état ne change jamais.

Les méthodes égales et hashcode de BigDecimal sont également remplacées par la valeur, contrairement à l'implémentation par défaut d'Object, qui compare les références. Il n'y a donc pas de différence entre BigDecimal.ZERO et new BigDecimal ("0") du point de vue de la façon dont ils sont utilisés, sauf que la création d'une nouvelle instance est plus de travail pour la JVM (et générera plus de déchets lorsque vous ne le faites pas '' plus besoin de cet objet).

BigDecimal étant immuable et basé sur des valeurs, la référence spécifique utilisée n'aura pas d'importance pour le code utilisant BigDecimal.

Étant donné que BigDecimal.ZERO est déjà créé pour vous et que les comparaisons entre BigDecimals se font par valeur, il est logique de minimiser le nombre de valeurs que vous utilisez afin que vos programmes créent moins de déchets. C'est pourquoi vous êtes encouragé à utiliser BigDecimal.ZERO.

7
Nathan Hughes