Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Member - Fatal编程技术网

在类之间共享Java变量的最佳方法

在类之间共享Java变量的最佳方法,java,variables,member,Java,Variables,Member,我在Java中遇到了一个奇怪的问题。我可以解决它,但解决方案似乎效率低下 我有一节课,它是简化的 class Zot { double edges[]; } 问题是,在许多情况下,我希望实例A和实例B共享一个边缘实例。换句话说,实例A可以分配边缘[2],并希望实例B共享边缘[2]。这很容易,因为我可以将实例B设置为指向实例的A边[2]。但我如何才能有效地做到这一点?如果我在实例A中分配边[],那么我可以简单地将B的实例分配给A。但通常我只想在A中分配一个边(例如边[2])

我在Java中遇到了一个奇怪的问题。我可以解决它,但解决方案似乎效率低下

我有一节课,它是简化的

 class Zot
 { 
      double edges[];
  }
问题是,在许多情况下,我希望实例A和实例B共享一个边缘实例。换句话说,实例A可以分配边缘[2],并希望实例B共享边缘[2]。这很容易,因为我可以将实例B设置为指向实例的A边[2]。但我如何才能有效地做到这一点?如果我在实例A中分配边[],那么我可以简单地将B的实例分配给A。但通常我只想在A中分配一个边(例如边[2]),然后在B中分配它。但在Java中,人们不能(据我所知)分配数组的单个成员(就像在C++中一样)。理想情况下,我只想分配有用的成员并分配它。当然,我可以分配所有4个成员,分配我需要的成员,然后将不需要的成员设置为null,让GC将其全部清除,但是如果有数百或数千个实例,这看起来很笨拙


建议?

您可以在这两个类之外声明并分配
双边缘[]
,然后将此数组作为构造函数中的参数传递给想要共享它的两个实例

在Java中,数组也是一个对象。当您创建一个像
double-edges[]=new-double[2]这样的实例时
将作为指针而不是副本传递


这意味着,如果您对类a中的数组进行了更改,那么类B也会看到此更改。

根据我的理解,您似乎希望在类之间共享
数组中的单个元素,而不是共享整个数组本身

如果您的
数组是一个
对象
的数组,那么这是可能的,并且是有意义的。但是,由于您的数组是一个基本数组,因此没有共享单个元素的真正概念

可以将数组中的一个元素指定为与另一个数组中的元素相等,但对一个数组中的元素所做的后续更改不会反映在另一个数组中

您可以在类之间共享整个数组,在这种情况下,任何更改都将反映在两个数组中(因为只有一个数组,所以两个类都将看到它们都引用的单个数组的更改)

最重要的是:
在java中声明原语数组时,内存会立即分配,因此仅声明数组中的单个元素没有任何好处(或机制)。因此,对于当前的数据模型,您没有理由不预先声明数组,因为您无法使用它们节省空间。

当您说“共享边缘[2]”时,您的意思是共享两个元素的数组吗,或者共享所述数组的元素2?几乎可以肯定,较大的对象将保留图形的边以及与这些边对应的边。+1您写得比我好:)非常感谢您的回复。然而,这似乎有点麻烦,最多。假设我正在分配一个1000x1000对象A的数组。将一个数组传递给每个对象充其量是很麻烦的。同样,我可以按照我建议的方式来做,但这在GC上似乎是浪费。但也许我没有看到简单的解决方案。它们会共享同一个数组吗?或者只有他们中的一些人会?如果只有一些,那么你应该考虑做一个提供者——一个为你保存数组的类,你可以在你的类中得到这些数组。要使其工作,您仍然需要将提供程序设置为静态的,或者将其传递到构造函数中的每个对象(或者以其他方式,例如,使用setter)对不起,我想我应该在开始时更加明确。该用例是一个代表景观的NxM单元矩阵。所以每个单元格都有一些成员变量,还有四条边,北、东、南、西。很明显,相邻单元之间共享边缘。我想实现的是让边缘成员在相邻的单元之间共享。几年前我在C++中编写了同样的算法。现在,我想用Java实现它。