在 Java 中,两个不同的 Double 对象可以共享相同的内存位置吗?



我的代码中有一些类似以下内容的类(不是确切的类,而是类似的结构)。

class Shop {
Item item;
Service service;
}
class Item {
...
Amount amt;
...
} 
class Service {
...
Amount amt;
...
} 
class Amount {
Double value;
String currencyCode;
}

我遇到了非常奇怪的情况,value对象中的Amountitem字段正在更改对象valueserviceAmount字段。 Java 是否以某种方式为这两个对象共享相同的内存?如果是,有什么解决方案可以避免这种情况?

2 个不同的双重对象?不。

但是 2 个不同的对象(一个服务对象和一个 Item 对象)当然都可以有一个变量,其值引用(如果你来自 C,它是一个指针,我们只是在 java 中称它们为"引用")相同的 Amount 实例。

考虑所有变量(除了基元)藏宝图,以及所有对象宝藏。

如果我在海滩上埋了一些宝藏,并画了一张地图来绘制我的宝藏,那是一回事。如果我然后潦草地写出我的地图副本,并给你这个副本,那么你对地图的副本做什么都无关紧要。把它扔进碎纸机里,只顾我;我不会注意到(在 java 中:如果项目确实"amt = null",那根本不会影响服务对象的 amt)。

但是,如果你拿着你的藏宝图副本,跟着它,挖出你在那里找到的宝藏,把它砸成碎片......我会注意到的。

2张藏宝图,但只有一张宝藏。

2 个可用的修复程序:

在将可变
  1. 对象交给其他代码之前,先制作可变对象的防御性副本,或者通常首选:

  2. 使你的对象不可变,一个 Amount 对象的构造函数应该设置它的值和 currencyCode,然后它不应该允许它们改变;valuecurrencyCode变量应该声明为 final。

不变的物体就像坚不可摧的宝藏。那大家知道埋在哪里就无所谓了,只能看着它,不能再改变它了。

注意:将货币价值放在双精度中是一个非常非常愚蠢的想法;并非每个存在的数字都可以准确地表示为双精度。你应该存储美分(所以,long cents;或者你可以凑合着用int cents;.其中"美分"是您所代表的货币代码允许在银行等处转账的原子最小金额。所以,对于美元来说,这将是一美分,欧元也是如此,对于日元来说,它是1日元。对于比特币,它将是1聪(0.00000001 BTC) - 所有货币都有一些有效不可分割的金额。代表那些。作为一个长。哒哒!现在,舍入行为很容易理解,这与双精度不同。

最新更新