Почему класс 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 должен быть использован, как если бы он был действительно неизменным.