2

私は次のクラスを持っています:

public class EnteredValues {

private HashMap<String, String> mEnteredValues;

public boolean change = false;
public boolean submit = false;
private static final EnteredValues instance = new EnteredValues();

// Singleton
private EnteredValues() {
    mEnteredValues = new HashMap<String, String>();
}

public static EnteredValues getInstance() {
    return instance;
}

public void addValue(String id, String value) {

    if (mEnteredValues.put(id, value) != null) {
        // A change has happened
        change = true;
    }
}

public String getValueForIdentifier(String identifier) {
    return mEnteredValues.get(identifier);
}

public HashMap<String, String> getEnteredValues() {
    return mEnteredValues;
}

public void clean() {
    mEnteredValues.clear();
    change = false;
    submit = false;
}
}

このクラスは、ユーザーがすでに入力した値を管理するために使用され、アプリケーション全体のすべてのクラスがこのクラスにアクセスできる必要があります。
アクティビティが変更されたら、clearメソッドを呼び出してシングルトンを「リセット」します。

静的クラスのオプションを実際に考慮せずに、シングルトンパターンを選択しました。
しかし今、私は静的クラスを使用するだけではいけないのだろうかと思っていました。

値を管理するだけのクラスを処理する一般的な方法は何ですか?静的クラスはシングルトンとして高速ですか?

どうも

4

4 に答える 4

4

シングルトンの状態をリセットするための明確な方法を提供しているという事実は、シングルトンを使用すべきではないことを示しています。州はグローバルであるため、これは危険な行動です。これはまた、ユニットテストが大きな苦痛になることを意味します。

もう一つ。インスタンス変数をパブリックとして宣言しないでください。それらをプライベートまたは保護されていると宣言し、ゲッターとセッターを提供します。また、デフォルト値である値でインスタンス変数を初期化する必要はありません。

于 2012-09-19T15:19:09.267 に答える
1

そのようなデザインが必要な場合、シングルトンを使用することの何が悪いのでしょうか。指定された処理を実行するように設計されたオブジェクトのインスタンスが1つだけ必要な場合、シングルトンは確かに悪い選択ではありません。

@see Java静的呼び出しは、非静的呼び出しよりも費用がかかりますか?

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlを読む

そこから:

注:静的にネストされたクラスは、他の最上位クラスと同じように、その外部クラス(および他のクラス)のインスタンスメンバーと対話します。事実上、静的にネストされたクラスは、動作上、パッケージ化の便宜のために別のトップレベルクラスにネストされたトップレベルクラスです。

于 2012-09-19T15:16:28.093 に答える
1

スタイルのためだけに

必要がなければ、シングルトンに頼らないほうがいいです。なんで?凝集力が少ない。外部から設定できるプロパティの場合は、単体テストを使用してアクティビティ(またはその他)をテストできます。必要に応じて、別のインスタンスを使用するように気を変えることができます。

私の謙虚なアドバイスは、各アクティビティにプロパティを設定し(おそらく、共通の基本クラスを定義できますか?)、新しい新しいインスタンスを使用してアクティビティの初期化時にプロパティを設定することです。

あなたのコードはそれを取得する方法について何も知りません(initコードを除いて、そしておそらくあなたは将来それを変更することができます)。

しかし、私が言ったように...ただ好みの問題です!:)

于 2012-09-19T15:17:52.653 に答える
1

静的クラスとシングルトンパターンの主な違いは、インターフェイスなどを実装する必要がある場合にシングルトンを使用できることです。この特定のケースでは、インターフェイスを実装していないため、静的クラスを使用した方がよいと思います。質問を一方が他方に高速であるかどうかを関連付けると、違いは無視できると思いますが、静的クラスを使用すると、クラスの動的インスタンス化の小さなオーバーヘッドが削除されます。

于 2012-09-19T15:12:27.190 に答える