Замена / переопределение Java "родных" классов?

Я работаю с BigDecimalи у меня есть требование, чтобы деление на 0 не приводило к ArithmeticException, но при возврате 0 вместо (странная математика бизнеса).

Это довольно новое требование, и у нас уже есть немного кода, который использует BigDecimalво многих местах. Я не хочу проходить через все эти места и проводить нулевые проверки. Это также не помогло бы мне со сторонними библиотеками, которые могли бы использовать внутренне BigDecimalи бросит ArithmeticExceptionвместо.

Я также хотел бы установить точность / масштаб по умолчанию и изменить compareTo метод, позволяющий игнорировать небольшие ошибки округления.

Из-за всех этих глобальных изменений, которые привели бы к созданию большого количества "стандартного" кода, мне пришла в голову идея изменить реализацию BigDecimal, Я уже делал это раньше для других сторонних классов, чтобы исправить некоторые ошибки самостоятельно.

Я заменил эти классы, создав класс с тем же именем в том же пакете, что и у стороннего класса, и поскольку внешние файлы JAR будут загружаться после моих собственных классов, я смог заменить их.

Но создавая java.math.BigDecimal мне не помогло, потому что кажется, что "нативные" классы Java загружаются даже раньше, чем мои собственные классы.

Давайте предположим, что я действительно хочу каждый BigDecimal в моем приложении работать немного по другому, как бы я смог заменить "официальный" BigDecimal? Могу ли я сделать это, и могут ли быть какие-то другие технические проблемы, о которых я не думал сейчас?

2 ответа

Решение

Вы должны поместить ваши классы в путь начальной загрузки, если вы хотите переопределить встроенные классы. Что касается мудрости в действительности сделать это (то есть ваши изменения будут влиять на весь JVM)...

BigDecimal не является окончательным, так что вы можете определенно расширить его самостоятельно и изменить его поведение (особенно путем переопределения методов divXXX()).

Вам не нужно менять параметры и т. Д., Но не забывайте менять тип фактически используемых объектов! Так что вы будете использовать "свои" методы.

Относительно compareTo() и т.д. у вас также не будет проблем - BigDecimal сам реализует Comparable интерфейс и имеет свой собственный compareTo(),

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