2013-01-22 25 views
0

來自某個人的基本問題來自於結構化對象編程......希望不要太基本。全球數據,靜態和新的

我想要在我的應用程序中有不同類共享的大量數據。 這樣做的最佳做法是什麼? 這是正確的嗎?

public class LargeData { 
    private static long[] myData; 
    private static final int MAX = 100000; 

    public LargeData() { 
     myData = new long[MAX]; 
     // ... initialize 
    } 

    public long getData(int x) { 
    // ... do whatever and return a long 
    } 
} 

如果這是正確的,如何正確的方式來訪問我的任何類的數據?我應該做一個

LargeData ld = new LargeData(); 

想要訪問到myData的每一個類裏面呢?

謝謝你,對不起,是太容易了... :)

回答

1

每當你在你的代碼中調用

LargeData ld = new LargeData(); 

,您將得到有效調用

myData = new long[MAX]; 

這是不對的。

你可以做的是:

public class LargeData { 

    private static final int MAX = 100000; 
    public static long[] myData = new long[MAX]; 
} 

和訪問它作爲LargeData.myData從任何地方。

+0

我想我應該在一開始就做一個「新」? –

+0

你的意思是編輯後就像現在一樣。 –

+1

謝謝,我認爲每個人一遍又一遍地重複我同樣的事情讓我明白了:) –

4

使用Singleton模式這一點。

+1

使用'Singleton'模式保存數組引用的目的是什麼? – mishadoff

+0

是不是單身人士執行惰性初始化的好習慣? –

+1

好吧,爲了保持它簡單...通過使用靜態屬性,您依賴於類加載器永遠不會放棄類實例(因爲如果他確實放開了,並且GC在靜態集合中的所有數據中踢開了) 。通過使用Singleton,您可以在某處持有對您的收藏的實時參考,GC將跳過它。在這種情況下myData不應該是靜態的。因此,辛格爾頓是一個不錯的選擇。 – fazhool

1

立即初始化數組。使用當前實現,您將無法使用靜態數組,直到創建LargeData的對象。

此外,如果僅用於存放數組的類阻止其實例化和擴展,則使其成爲final和構造函數爲private

public final class LargeData { 
    public static long[] myData = new long[100000]; 

    private LargeData() { } 
} 

並訪問爲LargeData.myData

+0

對不起。不知道我在想什麼。將刪除我以前的評論。感覺很蠢:/ –

+0

@VikramSingh全部刪除 – mishadoff

+0

這樣我就不需要這個類的任何實例了吧?我不需要做任何新的。 –

0

如果您從此類實例化兩個對象,第二個會導致您丟失存儲在該數組中的所有數據(您失去了對該實例構造器的引用的一個壞主意舊的數組,當第二個實例化覆蓋靜態引用時)。儘管如此,除非你確實真的需要一種「全局變量」方式的數據,否則它也是一個壞主意。最好將靜態引用看作全局變量,它可以由所有人(如果它們是公共的)都可以查看,或者僅從您在(私人)中定義它的類或其中之間(受保護或程序包保護的訪問)中可見的全局變量。幾乎在所有情況下,你幾乎都想避免使用它們,並且在類中使用Singleton模式而不是靜態變量。通過Singleton模式,您可以使用實例變量和非靜態獲取器來獲取數據。

但是我沒有看到給出的東西,你寫了爲什麼你需要一個singleton模式來解決這個特定的問題 - 你只是想將數據存儲在一個對象中並且共享該對象,對嗎?

您可以修復這樣的貼的代碼,而靜態的關鍵字,這允許多個LargeData實例在應用程序中是活一次:

public class LargeData { 
private long[] myData; // instance variable to store the data 
private static final int MAX = 100000; // max length 


public LargeData() { 
    myData = new long[MAX]; 

}

public long[] getData() { 
    return myData; 
} 

} 

然後你就可以使用數據爲:

LargeData ld = new LargeData(); 
long[] = ld.getData(); 

而且你可以用你喜歡的任何方式使用存儲在ld中的引用,你可以將它傳遞給其他類,等等。

一個更好的主意是不公開數組,而是創建一個API來通過它來使用存儲的數據。例如:

public long getLong(int n) { return myData[n]; } 
public void setLong(int n, long value) { myData[n] = value; } 

現在,如果你不想繞過參考存儲在LD的LargeData例如,你可以使用一個靜態變量LargeData存儲參考和靜態吸氣它可以讓你訪問它來自任何其他的Java代碼。如果您需要多個LargeData實例來處理您可以創建一個LargeDataRegistry類,該類封裝了一個Map,您將在其中存儲每個實例化的LargeData實例。