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にアクセスしたいすべてのクラスの内部?

簡単すぎてごめんなさい...:)

4

4 に答える 4

4

これにはシングルトン パターンを使用します。

于 2013-01-22T11:47:35.200 に答える
1

すぐに配列を初期化します。現在の実装では、のオブジェクトを作成するまで静的配列を使用できませんLargeData

finalまた、配列を保持するためだけのクラスの場合、それとコンストラクターを asにすることで、そのインスタンス化と拡張を防ぎますprivate

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

    private LargeData() { }
}

そして、次のようにアクセスしますLargeData.myData

于 2013-01-22T11:51:52.443 に答える
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

于 2013-01-22T11:52:19.137 に答える
0

インスタンスコンストラクタから静的変数に値を割り当てることは、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クラスを作成できます。

于 2013-01-22T12:59:00.997 に答える