2013-08-23 76 views
0

我在Java中遇到了一個奇怪的問題。我可以解決它,但解決方案似乎效率低下。在類之間共享Java變量的最佳方式

我有一個類,簡化是

class Zot 
{ 
     double edges[]; 
    } 

的問題是,在許多情況下我想實例A和實例B到共享邊緣實例中的一個。換句話說,實例A可以分配邊緣[2]並且希望實例B共享邊緣[2]。這很簡單,我可以將實例B設置爲指向實例的A邊[2]。但我怎樣纔能有效地做到這一點?如果我在實例A中分配了邊[],那麼我可以簡單地將B的實例分配給A,但通常我只想在A中分配一個邊(例如edge [2]),然後在B中分配它。但是,在Java中,不能(據我所知)分配一個數組的單個成員(就像在C++中一樣)。理想情況下,我只想分配有用的成員並分配它。當然,我可以分配所有4個成員,分配我需要的成員,然後將不需要的成員設置爲空,並讓GC清理它,但是如果有數百或數千個似乎笨拙的實例。

對此提出建議?

+0

當你說「share edge [2]」你是指共享兩個元素的數組,還是共享所述數組的元素2? –

+0

幾乎可以肯定,一個更大的對象將保持圖的邊緣以及與這些邊對應的邊。 –

回答

1

您可以在兩個類之外聲明並分配double edges[],然後將此數組作爲參數傳遞給構造函數中的兩個實例,以便共享它們。在數組中,數組也是一個對象。當您製作像double edges[] = new double[2];edges這樣的實例時,將作爲指針傳遞,而不是作爲副本。

這意味着如果您對A類中的數組進行更改,那麼B類也會看到此更改。

+0

+1你寫得比我好:) – alfasin

+0

非常感謝你的回覆。但是,這似乎有點麻煩。假設我正在分配一個1000x1000的對象A的數組。將數組傳遞給每個對象將會很麻煩。再次,我可以按照我的建議來完成,但對於GC來說似乎很浪費。但也許我沒有看到簡單的解決方案。 – rkwright

+0

他們都會共享相同的數組?或者只有其中一些會?如果只有一些,那麼你應該考慮做一個提供者 - 一個將爲你保存數組的類,並且你將能夠在你的類中獲得這些數組。爲了使它工作,你仍然需要使提供者靜態,或者將它傳遞給構造函數中的每個對象(或者其他方式 - 例如,使用setter) –

0

據我瞭解這個問題,你似乎想要在類之間共享你的edges數組中的單個元素,而不是共享整個數組本身。

如果你的edges數組是Object的數組,那麼這將是可能的,並且可能是有意義的。但是,由於你的數組是一個原始數組,因此沒有共享單個元素的真正概念。

您可以將數組的元素指定爲等於另一個數組的元素,但對其中一個數組中元素的後續更改不會反映到另一個數組中。

您可以共享類之間的整個數組,這種情況下,任何更改都會反映在兩個數組中(也就是說,只有一個數組,因此兩個類都會看到他們都參考的單個數組的更改)。

最重要的是: 當聲明在Java基元的陣列,因此沒有好處(或機構)來聲明僅陣列的單個元件的存儲器被立即分配。因此,對於您當前的數據模型,您沒有理由不預先聲明您的陣列,因爲您無法節省空間。