Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“替换/覆盖Java”;本地的;上课?_Java_Overriding_Bigdecimal - Fatal编程技术网

“替换/覆盖Java”;本地的;上课?

“替换/覆盖Java”;本地的;上课?,java,overriding,bigdecimal,Java,Overriding,Bigdecimal,我使用的是BigDecimals,我有一个要求,即除以0不应导致算术异常,而是返回0(奇怪的商业数学) 这是一个相当新的要求,我们已经有相当多的代码,在很多地方使用BigDecimals。我不想通过所有这些地方实施零检查。这对第三方库也没有帮助,它们可能在内部使用BigDecimals,并会引发arithmetricexception 我还想设置一个默认的精度/刻度,并将compareTo方法更改为能够忽略小的舍入误差 由于所有这些全局更改都会创建大量“样板”代码,因此我提出了更改BigDeci

我使用的是
BigDecimal
s,我有一个要求,即除以0不应导致
算术异常
,而是返回0(奇怪的商业数学)

这是一个相当新的要求,我们已经有相当多的代码,在很多地方使用
BigDecimal
s。我不想通过所有这些地方实施零检查。这对第三方库也没有帮助,它们可能在内部使用
BigDecimal
s,并会引发
arithmetricexception

我还想设置一个默认的精度/刻度,并将
compareTo
方法更改为能够忽略小的舍入误差

由于所有这些全局更改都会创建大量“样板”代码,因此我提出了更改
BigDecimal
的实现的想法。我之前已经为其他第三方类做过这项工作,以便自己修复某些bug

我通过在与第三方类相同的包中创建一个名称相同的类来替换这些类,因为外部jar文件将在我自己的类之后加载,所以我能够替换它们

但是创建一个
java.math.bigdome
对我没有帮助,因为看起来“原生”java类甚至在我自己的类之前就已经加载了


假设我真的希望我的应用程序中的每一个
BigDecimal
的工作方式都有所不同,那么如何替换“官方的”
BigDecimal
?我可以这样做吗?还有其他一些我现在没有想到的技术问题吗?

BigDecimal
不是最终的,所以您可以自己扩展它,并更改它的行为(特别是通过重写divideXXX()方法)

您不必更改参数等,但请记住更改实际使用对象的类型!所以你将使用“你的”方法


至于
compareTo()
等,您也不会有任何问题-
BigDecimal
本身实现了
Comparable
接口,并且有自己的
compareTo()

BigDecimal
不是最终的,因此您可以自己扩展它,并改变它的行为(特别是通过重写divideXXX()方法)

您不必更改参数等,但请记住更改实际使用对象的类型!所以你将使用“你的”方法



至于
compareTo()
等,您也不会有任何问题-
BigDecimal
本身实现了
Comparable
接口,并有自己的
compareTo()
如果您想覆盖内置类,您必须将类放入。至于实际这样做的智慧(即,您的更改将影响整个jvm)…

如果您想覆盖内置类,您必须将您的类放入。至于实际这样做是否明智(即,您的更改将影响整个jvm)…

您对我的问题有点误解。我知道我可以扩展它,但如果可以的话我想避免。默认的
compareTo
方法可能存在,但我希望它忽略一个小差异。例如,0=0.0001。@我不明白你为什么要避免(?)它。原因是什么,为什么不呢?如果我误解了你的问题,那么请多解释一下,因为你现在拥有的是你问题的解决方案,你拒绝使用,因为。。。我真的不知道为什么。因为我们有很多已经使用BigDecimal的代码,所以我不得不用CustomBigDecimal来代替所有这些,这是一项更大的工作,新的代码开发人员/维护人员可能会忘记使用自定义的,在使用标准的时候会引入“bug”。它也不会影响第三方库。@没问题,那么您打算如何在不更改类型的情况下神奇地更改它?显然你必须改变它,你读过我的答案吗?您不会更改任何方法声明,只更改运行时使用的对象<根据IS-a关系,code>YourNewBigDecimal
也将是一个
BigDecimal
。你误解了我的问题。我知道我可以扩展它,但如果可以的话我想避免。默认的
compareTo
方法可能存在,但我希望它忽略一个小差异。例如,0=0.0001。@我不明白你为什么要避免(?)它。原因是什么,为什么不呢?如果我误解了你的问题,那么请多解释一下,因为你现在拥有的是你问题的解决方案,你拒绝使用,因为。。。我真的不知道为什么。因为我们有很多已经使用BigDecimal的代码,所以我不得不用CustomBigDecimal来代替所有这些,这是一项更大的工作,新的代码开发人员/维护人员可能会忘记使用自定义的,在使用标准的时候会引入“bug”。它也不会影响第三方库。@没问题,那么您打算如何在不更改类型的情况下神奇地更改它?显然你必须改变它,你读过我的答案吗?您不会更改任何方法声明,只更改运行时使用的对象<根据IS-a关系,code>YourNewBigDecimal也将是一个
BigDecimal
。这使我更接近了一步,但似乎我必须为所有java类设置此路径,并提供一组全新的运行时,而不能仅仅替换单个类。我一直在考虑如何操作类加载器…@noone-为什么需要提供整个运行时?您只需要将类放在运行时其余部分前面的bootclasspath中(即
-Xbootclasspath/p
)。对我来说不可行,因为这是一个非标准选项,我的JVM不支持它。@noone-那是哪个JVM?这让我更接近了一步,但似乎我必须为所有java类设置此路径,并提供一组全新的运行时,而不能仅仅替换