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

问题描述 投票:-2回答:1

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

class Shop {
  Item item;
  Service service;
}

class Item {
  ...
  Amount amt;
  ...
} 

class Service {
  ...
  Amount amt;
  ...
} 

class Amount {
  Double value;
  String currencyCode;
}

[我遇到了非常奇怪的情况,其中更改value对象中Amountitem字段正在更改value对象中的Amountservice字段。Java是否以某种方式为这两个对象共享相同的内存?如果是,如何避免这种情况?

java double heap-memory
1个回答
0
投票

2个不同的双重对象?编号

但是2个不同的对象(一个Service对象和一个Item对象)当然可以都具有一个变量,其值引用(如果您来自C,则是一个指针,在Java中我们将其称为“引用”)相同的数量实例。

考虑所有变量(基本变量除外)的藏宝图,以及所有对象的藏宝。

如果我在海滩上埋藏一些宝藏,并在我的宝藏上绘制一张地图,那是一回事。然后,如果我在地图上划了一个copy并给了您这份副本,那么您对地图副本所做的操作都没关系。为了我的照顾,把它扔进粉碎机。我不会注意到(在Java中:如果Item的确是'amt = null',那将完全不会影响Service对象的amt)。

但是,如果您拿了藏宝图的副本,请遵循它,将在那找到的藏宝挖出来,并将其粉碎成碎片...我会注意到的。

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

2个可用的修复程序:

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

  2. 使您的对象不可变,Amount对象的构造函数应设置其值和currencyCode,然后不应再对其进行更改; valuecurrencyCode变量应声明为final。

不可变的物体就像坚不可摧的宝藏。然后,每个人都知道它被埋在哪里不再重要,他们只能看着它,不能再对其进行更改。

NB:将货币价值翻倍是一个非常非常愚蠢的想法;并非所有存在的数字都可以准确地表示为双精度。您应该存储美分(因此,long cents;或您可以使用int cents;。其中,“ cent”是您所代表的currencyCode允许在银行等进行转账的原子性最小金额。),美元等于1美分,欧元等于1日元,比特币等于1聪(0.00000001 BTC)-所有货币都具有一定的不可分割的数量。现在,四舍五入的行为很容易理解,与双精度有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.