web-dev-qa-db-fra.com

java bibliothèque mathématique pour BigDecimal qui autorise les valeurs nulles

Existe-t-il une bibliothèque BigDecimal avec les opérations de base de BigDecimal qui autorise les valeurs nulles?

Null doit être traité comme 0 à des fins mathématiques.

Je ne veux pas faire toutes les vérifications nulles pour d'éventuelles valeurs nulles.

Soit vous n'autorisez jamais les valeurs nulles dans la base de données, l'application ou la vue et initialisez tout avec new BigDecimal(0), soit vous effectuez des vérifications nulles à chaque utilisation des valeurs nullables.

Quelque chose comme:

public static BigDecimal add(final BigDecimal value, final BigDecimal augend)
{
    if (value == null)
        return augend;
    else if (augend == null)
        return value;
    else
        return value.add(augend);
}

public static BigDecimal multiply(final BigDecimal value, final BigDecimal multiplicand)
{
    if (value == null || multiplicand == null)
        return null;

    return value.multiply(multiplicand);
}
14
djmj

Enregistrez le codage, mais n'autorisez pas les valeurs nulles dans la base de données. Définissez la valeur par défaut sur zéro.

Quant à new BigDecimal(0): non, utilisez BigDecimal.ZERO.

16
user207421

J'ai eu un problème similaire (pas lié à une base de données cependant, juste besoin de résumer quelques BigDecimals éventuellement nuls). Je n'ai trouvé aucune bibliothèque, j'ai donc dû écrire moi-même la fonction suivante:

public static BigDecimal add(BigDecimal... addends) {
    BigDecimal sum = BigDecimal.ZERO;
    if (addends != null) {
        for (BigDecimal addend : addends) {
            if (addend == null) {
                addend = BigDecimal.ZERO;
            }
            sum = sum.add(addend);
        }
    }
    return sum;
}

La même chose dans Java 8:

public static BigDecimal add(BigDecimal... addends) {
    if (addends == null) {
        return BigDecimal.ZERO;
    }
    return Arrays.stream(addends)
            .filter(Objects::nonNull)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}
12
Bunarro

Je suppose que je ne vois pas l'intérêt de la bibliothèque pour vérifier null. Bien sûr, la bibliothèque ne lancera pas de NPE, mais l'appelant devra éventuellement le vérifier. Que va faire l'appelant de votre multiplicateur ci-dessus? Il ne peut pas simplement utiliser la sortie. Il va falloir vérifier si la valeur retournée est nulle à un moment donné avant de pouvoir faire quoi que ce soit avec la valeur.

De plus, pour toute application que j'ai écrite, un null est très différent de zéro. Je ne voudrais pas en utiliser un qui traite un null comme nul.

Si votre exigence est que les valeurs nulles ne sont pas autorisées dans votre base de données, je vérifierais les valeurs nulles dans votre couche DAO avant d'écrire dans la base de données.

5
Kyle