为什么java中的BigInteger被设计为不可变的?

时间:2015-10-19 23:26:28

标签: java immutability biginteger

在java中,BigInteger是不可变的,但我想理解为什么,因为很多时候它被用来做很多可以产生很多对象的计算。所以,不要让它变得不可变,感觉有点直观。我想到的情况就是字符串操作,然后是StringBuilder的选项。应该有BigInteger的非永久性对应物吗?我认为在很多情况下这可能是有益的。

编辑:我知道不变性的好处以及在许多情况下它是如何有益的。我只是想了解一下BigInteger的好处。我用BigInteger来计算大数的阶乘。所以,我更喜欢可变的BigInteger。类似地,BigInteger将用于计算,其结果远大于int。对于其他情况,有BigDecimal。

1 个答案:

答案 0 :(得分:13)

Josh Bloch的

Effective Java在“第15项:最小化可变性”中解释了不可变类的好处:

  

不可变类   比设计,实现和使用更容易   可变课程。它们不太容易发生   错误,更安全。

不可变对象是 simple ,因为该对象只能存在于一个状态 - 它所创建的状态。简单代码往往具有更少的错误。由于无法修改对象,因此无需外部同步即可线程安全

Bloch使用BigInteger作为示例解决了不可变类的性能问题:

  

不可变类的唯一真正缺点是它们需要一个   每个不同值的单独对象。创建这些对象可能成本很高,   特别是如果它们很大的话。 [...]

     

在内部,不可变类可以任意聪明。例如,BigInteger有一个包私有的可变“伴侣类”,它用于加速多步操作,例如模幂运算。   由于前面提到的所有原因,使用可变伴随类比使用BigInteger要困难得多,但幸运的是你不必:BigInteger的实现者为你做了很多努力。

在内部,BigInteger已经为您做了一些优化。如果你真的想要一个可变BigInteger,你可以使用BitSet,但请注意,这可能会使你的代码更复杂 - 而且更容易出错。您应该使用最简单的解决方案(BigInteger),除非您确信使用可变版本会给您带来明显的性能提升(另请参阅“项目55:明智地优化”)。