在Java应用程序中将原语更改为Boxed Primitive的后果

时间:2011-02-10 16:02:37

标签: java autoboxing

我正在开发一个应用程序,其中给定项目的所有性能值都是基元。但是,现在有可能在向系统添加新数据时,其中一个值 - Revenue - 不可用。在这些情况下,我们可以简单地将Revenue的值存储/显示为0.00

但是,我们现在还希望能够在以后添加此缺失数据(但不会覆盖数据,如果存在)。在将0.00添加到数据库时,不是添加标志来指示Revenue是否实际可用,我很明显将Revenue从基本类型double更改为盒装基元Double,并允许NULLS用于db中的Revenue列。 / p>

应用程序中有多个地方可以调用getRevenue(),并且对值执行数学运算。显然现在有可能getRevenue()返回null可能会导致重大问题。正如我所提到的,我们非常乐意在没有价值的情况下将Revenue的值设为0.00。

因此,似乎一个明显的解决方案是更新getRevenue()方法以返回值,或者在值为null的情况下更新0.00。并添加一个新方法getRevenueDB(),它返回Revenue的真值,包括null。只有在访问要添加到db的值时才会调用此方法。

这似乎是一个解决方案?它工作很快,很快。但这看起来是一个非常糟糕的解决方案,有更好的选择吗?

非常感谢所有评论!

3 个答案:

答案 0 :(得分:1)

你实际上有两个客户端,一些需要看到NULL,一些明确看不到空值的客户端。

如果确实将“不知道”转换为“零”具有商业意义,那么我认为拥有两个不同的访问者是有效的。

我可能会选择一个不同的名称getXxxxDb(),例如getXxxxxOrNull(),我的理由是可以想象它不仅是Db最终会关注它是否为null,

答案 1 :(得分:1)

代表“无价值”作为null是正确的事情。

替代实现是在每次调用getRevenue()之后插入空值检查,这也是可以的。取决于您是否希望在模型或服务层中增加复杂性。

答案 2 :(得分:0)

如果您将Revenue列保留为not null并将空存/缺少的收入存储为零,那么将其存储为零怎么样?您甚至可以使用触发器或默认值在数据库级别执行此操作。