2011-02-10 3 views
1

Je travaille sur une application dans laquelle toutes les valeurs de performance pour un élément donné sont des primitives. Cependant, il est maintenant possible que l'une de ces valeurs - Revenue - ne soit pas disponible lors de l'ajout de nouvelles données au système. Dans ces cas, nous allons simplement stocker/afficher la valeur pour Revenu comme 0.00Conséquences de la modification d'une primitive dans une primitive Boxed dans une application Java

Cependant, nous voulons maintenant pouvoir ajouter ces données manquantes à une date ultérieure (mais pas écraser les données si présentes). Plutôt que d'ajouter des drapeaux pour indiquer si Revenu était effectivement disponible lorsque 0.00 a été ajouté à la base de données, il me semble évident de changer Revenue du type primitif double en double primitif boxed, et autoriser NULLS pour la colonne Revenue dans la base de données.

Il existe différents endroits dans l'application où getRevenue() est appelé, et les opérations mathématiques sont effectuées sur la valeur. Evidemment maintenant avoir le potentiel pour que getRevenue() renvoie null peut causer des problèmes majeurs. Comme je l'ai mentionné cependant, nous sommes parfaitement heureux de présenter le chiffre d'affaires comme ayant une valeur de 0,00 dans les cas où il n'y a pas de valeur présente. Donc, il semble qu'une solution évidente serait de mettre à jour la méthode getRevenue() pour retourner la valeur, ou 0.00 dans le cas où la valeur est nulle. Et pour ajouter une nouvelle méthode getRevenueDB() qui renvoie la vraie valeur de Revenue, y compris null. Cette méthode ne serait appelée que lors de l'accès à la valeur à ajouter à la base de données.

Comment cela semble-t-il être une solution? Il shouold travail, et est rapide. Mais cela semble-t-il une solution horriblement sale, pour laquelle il existe une meilleure option disponible?

Tous les commentaires sont très appréciés!

+0

Que dit votre test de performance? Comment est la performance avec le type primitif et comment est la performance avec le type de wrapper? – Puce

+0

C'est bon. Plus compliqué, plus sale. – irreputable

+0

@irreputable: plus compliqué que quoi? – QuakerOat

Répondre

1

Vous avez effectivement deux clients, certains qui ont besoin de voir certains qui ne doivent explicitement pas voir les valeurs nulles.

S'il est vraiment logique de convertir "Ne sait pas" en "Zéro", je pense qu'il est valable d'avoir deux accesseurs différents.

Je pourrais choisir un autre nom que getXxxxDb() par exemple getXxxxxOrNull(), mon raisonnement étant qu'il est concevable que c'est non seulement le Db qui prendra soin par la suite si elle est nulle,

0

Qu'en est-il de garder la colonne Chiffre d'affaires not null et de la stocker comme zéro lorsque vous avez un chiffre d'affaires vide/manquant à stocker? Vous pouvez même être en mesure de le faire au niveau de la base de données avec un déclencheur ou une valeur par défaut.

+0

Mais si je devais stocker ces valeurs de revenus vides/manquantes comme zéro (comme nous le faisons maintenant) est impossible de déterminer si cette valeur est due au fait que la valeur de Revenue a vraiment une valeur de 0,00 ou si elle est simplement manquante dans les données.Le seul type de valeur que je pourrais connaître pour représenter les données manquantes serait une valeur négative, qui semble vraiment sale, et nécessiterait plus de travail que ma solution actuelle pour mettre en œuvre. – QuakerOat

1

Représentant « aucune valeur » comme null est la bonne chose à faire.

L'implémentation alternative consiste à insérer des vérifications nuls après chaque appel à getRevenue() où cela est nécessaire, ce qui est également correct. Cela dépend de la complexité supplémentaire de votre modèle ou de votre couche de service.

Questions connexes