如果您從此類實例化兩個對象,第二個會導致您丟失存儲在該數組中的所有數據(您失去了對該實例構造器的引用的一個壞主意舊的數組,當第二個實例化覆蓋靜態引用時)。儘管如此,除非你確實真的需要一種「全局變量」方式的數據,否則它也是一個壞主意。最好將靜態引用看作全局變量,它可以由所有人(如果它們是公共的)都可以查看,或者僅從您在(私人)中定義它的類或其中之間(受保護或程序包保護的訪問)中可見的全局變量。幾乎在所有情況下,你幾乎都想避免使用它們,並且在類中使用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實例。
我想我應該在一開始就做一個「新」? –
你的意思是編輯後就像現在一樣。 –
謝謝,我認爲每個人一遍又一遍地重複我同樣的事情讓我明白了:) –