1

現在Androidアプリを作成していますが、静的メソッド/フィールドをいつ使用するかについて、より高いレベルの質問があります。

私のアプリは、さまざまなアクティビティにわたる時間の使用状況を追跡します。各アクティビティはクラスのインスタンスです。このクラスのすべてのインスタンスを返すことができるメソッドが必要です。

次のように、Activityクラスに静的メソッド/フィールドを配置するのは悪い設計ですか?

static ArrayList<Activity> allInstances;    
public static void addToComprehensiveList(Activity a) {
    if(allInstances == null)
        allInstances = new ArrayList<Activity>();
    allInstances.add(a);
}
public static ArrayList<Activity> getComprehensiveList() {
    return allInstances;
}

ここでの正しい設計の選択は何ですか?

4

2 に答える 2

3

インスタンスの静的リストを保持することは、かなり安全で通常のことです。主な落とし穴は、リストにアイテムを追加するときと関係があります。

たとえば、起動時にActivity呼び出す重要なコンストラクターがあるaddToComprehensiveList(this)場合、完全に初期化されていないオブジェクトが公的にアクセス可能なリストに含まれることがあります。プログラムがシングルスレッドの場合、これはそれほど危険ではありません。コンストラクターが後で例外をスローしない限り、例外がスローされます。例外が発生した場合、オブジェクトは完全に初期化されていない状態でリストに残ります。

これを回避する安全な方法は、オブジェクトが作成された後にリストにオブジェクトを追加するファクトリメソッドでインスタンスを作成することです。もちろん、サブクラスがない場合は、コンストラクターの最後のステートメントとしてリストに追加するだけで問題ありません。

ここでのもう1つの危険はgetComprehensiveList()、インスタンスリストへの参照を返すことです。これは、クライアントコードが、クラスに気付かれずにそのリストを変更する可能性があることを意味します。クライアントがリストを反復処理しただけでも、反復中に新しいアクティビティを作成すると、商品化の例外が発生します。より安全な方法は、リストのコピーを返すことです。

于 2012-12-21T02:15:58.463 に答える
-2

重いストレスやメモリの使用の下で、このようなことをした私の経験から:

static ArrayList<Activity> allInstances; 

利用可能であることが保証されていません。VMはそれを無効にすることができるため、シングルトンの方が少し安全かもしれません。

于 2012-12-21T02:36:58.823 に答える