【问题标题】:Why is Java's BigDecimal class not declared as final?为什么 Java 的 BigDecimal 类没有声明为 final?
【发布时间】:2015-11-01 15:16:52
【问题描述】:

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

类 BigDecimal

public class BigDecimal
extends Number
implements Comparable<BigDecimal>

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

(来自Oracle Docs)

这是有特定原因还是开发人员只是忘记添加该关键字?不将不可变类声明为 final 是一种好习惯吗?

BigInteger 也是如此,但声明为 final 的 String 则不然。

【问题讨论】:

标签: java immutability final


【解决方案1】:

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

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

(强调我的)。

由于 Java 一直倾向于向后兼容,因此现在将其定为 final 是毫无疑问的:它会破坏现有的子类。

也就是说,就像使用 Date 时一样,我只是假设没有人会继承 BigDecimal,因此 BigDecimal 应该像真正不可变一样被使用。

【讨论】:

  • Joshua 在第 15 项中提到:Java 平台库包含许多不可变类,包括 String、盒装原始类以及 BigInteger 和 BigDecimal。但是由于该类未标记为final,因此不受信任的客户端可能会通过子类化来提供参数。那么他为什么提到这个类是不可变的呢?
猜你喜欢
  • 2011-01-29
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多