BigDecimal(“0”)和BigDecimal.ZERO之间是否有区别?

26

无论是用于比较还是初始化新变量,使用这两个中的哪一个有区别吗?

我知道BigDecimal.ZERO是1.5的功能,所以这是一个问题,但假设我正在使用1.5,这有关系吗?

谢谢。

4个回答

37

BigDecimal.ZERO是一个预定义的常量,因此不需要像BigDecimal("0")那样在运行时从字符串中计算出来。这样做会更快,也不需要创建新的对象。

如果你的代码需要在1.5版本之前运行,那么可以使用(备受诟病的)单例模式创建等同于BigDecimal.ZERO的对象。第一次使用它时,会调用BigDecimal("0")来创建一个零对象,并在后续调用时返回该对象。否则,如果你的代码在1.5系统上运行,你的单例对象可以直接返回BigDecimal.ZERO,而不会有运行时的惩罚。


1
new BigDecimal("0") 每次都会创建一个新的对象实例,但是 BigDecimal.ZERO 不会创建新实例。 - Juha Syrjälä
如果您只需在名为“Constants”的final类中创建public static final,然后使用它,那么就不需要创建单例。 - Spencer Kormos
1
@Spencer 那是一样的东西 - wds

14

使用ZERO不会创建新的对象,也不需要任何解析。绝对是推荐的方式。


4

在谈论运行时惩罚之前,请确保这段代码很重要。设置分析,并测量完整使用情况。

尽管如此,最好使用Bigdecimal.ZERO,因为它在编译时经过检查,而您可能会意外输入new BigDecimal(“9”),编译器将接受它,但会导致应用程序出错。


你可以对任何数字这样说。 - Robert L
1
@RobertL:是的,但这会消除其中一个数字,风险减少了1/10 :)。它也不可能抛出“NumberFormatException”。 - wchargin

3

出于好奇,我查看了BigDecimal的构造函数,发现它没有针对字符串"0"的任何优化。因此,肯定存在差异。


3
无论如何都会有所不同,因为每次调用 new BigDecimal("0") 都会创建一个新的对象。 - Jon Skeet
无可辩驳。我只是好奇不使用ZERO会有多大的惩罚。事实证明,这是相当严重的,因为BigDecimal的构造函数非常繁重。 - Allain Lalonde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接