在检查Java的BigDecimal
类的源代码时,我很惊讶它是不声明为final class
:
类BigDecimal
public class BigDecimal extends Number implements Comparable<BigDecimal>
不可变,任意精度的有符号十进制数。
(来自Oracle Docs)
是否有特定原因或开发人员忘记添加该关键字?不将不可变类声明为final是不错的做法?
同样适用于BigInteger
,但不适用于被宣布为最终的String
。
答案 0 :(得分:14)
引自https://blogs.oracle.com/darcy/entry/compatibly_evolving_bigdecimal:
然而,由于BigDecimal不是final的,因此可能存在复杂性,因为它有公共构造函数,所以它可以是子类。 (正如Effective Java,Item 13,Favor Immutability中讨论的那样,这是在编写课程时的设计疏忽。)
(强调我的)。
由于Java一直倾向于向后兼容,因此现在将其作为最终版本是不可能的:它会破坏现有的子类。
也就是说,就像使用Date时一样,我只是假设没有人将BigDecimal子类化,因此BigDecimal应该被用作真正不可变的。