我在Java中有一个奇怪的问题。我可以解决它,但解决方案似乎效率低下。
我有一个类,简化为
class Zot
{
double edges[];
}
问题在于,在许多情况下,我希望实例A和实例B共享一个边缘实例。换句话说,实例A可以分配边[2]并希望实例B共享边[2]。这很容易,因为我可以将实例B设置为指向实例的A边缘[2]。但我怎么能有效地做到这一点?如果我在实例A中分配了edges [],那么我可以简单地将B的实例指定为指向A.但是我经常只想在A中分配单个边(例如edge [2])然后在B中分配它。在Java中,我不能(据我所知)分配一个数组的单个成员(就像在C ++中一样)。理想情况下,我只想分配有用的成员并分配它。当然,我可以分配所有4个成员,分配我需要的成员,然后将不需要的成员设置为null并让GC清理它们,但是如果有数百或数千个实例看起来很笨拙。
建议?
答案 0 :(得分:1)
您可以在两个类之外声明和分配double edges[]
,然后将此数组作为构造函数中的参数传递给要共享它的两个实例。
在Java中,数组也是一个对象。当您创建像double edges[] = new double[2];
edges
这样的实例时,它将作为指针传递,而不是作为副本传递。
这意味着如果您在A类中对数组进行更改,那么B类也会看到此更改。
答案 1 :(得分:0)
据我所知,您似乎想要在类之间共享edges
数组中的单个元素,而不是共享整个数组。
如果您的edges
数组是Object
的数组,那么这是可能的,并且可能有意义。但是,由于您的数组是原始数组,因此没有共享单个元素的真实概念。
您可以指定数组的元素与另一个数组的元素相等,但对一个数组中元素的后续更改不会反映在另一个数组中。
您可以在类之间共享整个数组,在这种情况下,任何更改都将反映在两个数组中(好吧,只有一个数组,因此两个类都会看到它们都引用的单个数组的更改)。 / p>
最重要的是: 当您在java中声明一个基元数组时,会立即分配内存,因此没有任何好处(或机制)来声明该数组的单个元素。因此,对于您当前的数据模型,您没有理由不预先声明您的数组,因为您无法使用它们节省空间。