为什么Java的BigDecimal类没有被声明为final?

时间:2015-11-01 15:16:53

标签: java immutability final

在检查Java的BigDecimal类的源代码时,我很惊讶它是声明为final class

  

类BigDecimal

public class BigDecimal
extends Number
implements Comparable<BigDecimal>
     

不可变,任意精度的有符号十进制数。

(来自Oracle Docs

是否有特定原因或开发人员忘记添加该关键字?不将不可变类声明为final是不错的做法?

同样适用于BigInteger,但不适用于被宣布为最终的String

1 个答案:

答案 0 :(得分:14)

引自https://blogs.oracle.com/darcy/entry/compatibly_evolving_bigdecimal

  

然而,由于BigDecimal不是final的,因此可能存在复杂性,因为它有公共构造函数,所以它可以是子类。 (正如Effective Java,Item 13,Favor Immutability中讨论的那样,这是在编写课程时的设计疏忽。)

(强调我的)。

由于Java一直倾向于向后兼容,因此现在将其作为最终版本是不可能的:它会破坏现有的子类。

也就是说,就像使用Date时一样,我只是假设没有人将BigDecimal子类化,因此BigDecimal应该被用作真正不可变的。