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

Fri*_*jof 10 java final immutability

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

类BigDecimal

public class BigDecimal
extends Number
implements Comparable<BigDecimal>
Run Code Online (Sandbox Code Playgroud)

不可变的,任意精度的带符号十进制数.

(来自Oracle Docs)

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

同样的情况也适用BigInteger,但不是String宣布为最终的.

JB *_*zet 14

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

但是,由于BigDecimal不是最终的,并且因为它具有公共构造函数,所以这里可能存在复杂性,因此它可以是子类.(正如Effective Java,Item 13,Favor Immutability中所讨论的,这是在编写类时的设计疏忽.)

(强调我的).

由于Java总是倾向于向后兼容,因此现在最终使它成为最终版本是不可能的:它会破坏现有的子类.

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

  • Joshua 在第 15 条中提到:Java 平台库包含许多不可变类,包括“String”、装箱原始类以及“BigInteger”和“BigDecimal”。但由于该类未标记为“final”,不受信任的客户端可能会通过子类化该类来提供参数。那么他为什么提到类是不可变的呢? (2认同)