While checking the source code of Java's BigDecimal
class, I was surprised that it was not declared as a final class
:
Class BigDecimal
public class BigDecimal
extends Number
implements Comparable<BigDecimal>
Immutable, arbitrary-precision signed decimal numbers.
(from the Oracle Docs)
Is there a specific reason for this or did the developers just forget to add that keyword? Is it a good practice to not declare immutable classes as final?
The same goes for BigInteger
, but not for String
which is declared as final.
Quote from https://blogs.oracle.com/darcy/entry/compatibly_evolving_bigdecimal:
However, there is a possible complication here since BigDecimal is not final and since it has public constructors, it can be subclassed. (As discussed in Effective Java, Item 13, Favor Immutability, this was a design oversight when the class was written.)
(emphasis mine).
Since Java has always favored backward compatibility, making it final now is out of question: it would break existing subclasses.
That said, just as when using Date, I would simply assume that no-one ever subclasses BigDecimal, and that BigDecimal should thus be used as if it were truly immutable.