为什么Java的BigDecimal类没有被宣布为最终类?

2022-09-03 02:14:58

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

类大十进制

public class BigDecimal
extends Number
implements Comparable<BigDecimal>

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

(摘自 Oracle Docs)

是否有具体原因,或者开发人员只是忘记添加该关键字?不将不可变类声明为最终类是一种好的做法吗?

BigInteger也是如此,但不适用于被声明为 final 的 String


答案 1

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

但是,这里可能存在一个复杂问题,因为 BigDecimal 不是最终的,并且由于它具有公共构造函数,因此可以对其进行子类化。(正如在 Effective Java 第 13 项 Favor Immutability 中所讨论的,这是编写该类时的设计疏忽

(强调我的)。

由于Java一直倾向于向后兼容性,因此现在使其最终确定是没有问题的:它会破坏现有的子类。

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


答案 2