インスタンスコンストラクタから静的変数に値を割り当てることは、nullチェックなしでは悪い考えです-このクラスから2つのオブジェクトをインスタンス化すると、2番目のオブジェクトによって配列に格納されているすべてのデータが失われます(古い配列への参照が失われると、 2番目のインスタンス化は静的参照を上書きします)。ただし、nullチェックを使用する場合は、「グローバル変数」のような1つのインスタンスでデータが本当に必要な場合を除いて、これも悪い考えです。静的参照は、すべての人が表示できる(パブリックの場合)か、定義したクラスからのみ表示できる(プライベート)か、その中間の何か(保護されたアクセスまたはパッケージで保護されたアクセス)のいずれかで表示できるグローバル変数と考えるのが最適です。ほとんどの場合、それらの使用を避け、クラス内の静的変数の代わりにシングルトンパターンを使用することをお勧めします。
しかし、あなたが書いたものを考えると、この特定の問題にシングルトンパターンが必要な理由はわかりません。データをオブジェクトに格納し、そのオブジェクトを共有したいだけですよね?
静的キーワードなしでこのように投稿されたコードを修正できます。これにより、アプリケーションで複数の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インスタンスを操作する必要がある場合は、インスタンス化された各LargeDataインスタンスを格納するマップをカプセル化するLargeDataRegistryクラスを作成できます。