Почему класс Java BigDecimal не объявлен как финальный?

При проверке исходного кода Java BigDecimal класс, я был удивлен, что он не был объявлен как final class:

Класс BigDecimal

public class BigDecimal
extends Number
implements Comparable<BigDecimal>

Неизменные знаковые десятичные числа произвольной точности.

(из документов Oracle)

Есть ли для этого особая причина, или разработчики просто забыли добавить это ключевое слово? Является ли хорошей практикой не объявлять неизменяемые классы как окончательные?

То же самое касается BigInteger, но не для String который объявлен как окончательный.

1 ответ

Решение

Цитата из https://blogs.oracle.com/darcy/entry/compatibly_evolving_bigdecimal:

Однако здесь есть возможное осложнение, поскольку BigDecimal не является окончательным и, поскольку он имеет открытые конструкторы, он может быть разделен на подклассы. (Как обсуждено в Эффективной Java, Пункт 13, Неизменность Пользы, это было упущением дизайна, когда класс был написан.)

(акцент мой).

Поскольку Java всегда предпочитала обратную совместимость, сделать ее окончательной сейчас не может быть и речи: она сломает существующие подклассы.

Тем не менее, как и при использовании Date, я бы просто предположил, что никто никогда не подклассов BigDecimal, и что BigDecimal должен быть использован, как если бы он был действительно неизменным.

Другие вопросы по тегам