Замена / переопределение 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()
,