0

では、その質問をもう少し簡単にしようと思います。

この質問の核心は、静的メソッドをいつ使用するかについてですが、静的メソッドとインスタンスメソッドの箇条書きの理論的概念を確認した後、以下に説明するように、現実世界の問題を使用したより実用的な実装の提案をしたいと思います。

  1. 共有設定の設定と取得を処理するAndroidクラス(MyPreferences)があります。
  2. MyPreferencesのコンストラクターに登録されたカスタムリスナーがあり、変更されるたびに変更されたプリファレンスを表示します。
  3. コンストラクターにも一般的なものがあります。settings=ctx.getSharedPreferences(MyConfig.NAME_SHARED_PREFERENCES、0); editor = settings.edit(); settings.registerOnSharedPreferenceChangeListener(listener);

さて、先に述べたように、MyPreferenceには共有設定キーを取得/更新する10個の関数があります...

public static void setPrefsIsAppEnabled(Boolean boolValue) {
        editor.putBoolean(MyConfig.PREFS_IS_APP_ENABLED, boolValue);
        editor.commit();            
}

public static boolean getPrefsIsAppEnabled()
{
    return settings.getBoolean(MyConfig.PREFS_IS_APP_ENABLED, false);
}

現在、静的な方法(つまり、MyPreferences.getPrefsIsAppEnabled())を使用して、プロジェクト内の他のクラスのこれらのゲッターとセッターを使用しています。

共有設定オブジェクトの初期化を持つコンストラクターが呼び出されないため、これは明らかにエラーをスローします。

私の質問:getterメソッドとsetterメソッドにアクセスする前に、これらの10個のメソッドすべてを非静的にし、プロジェクト全体でMyPreferenceをインスタンス化する方が良いロジックですか、それともコンストラクターに存在するコードをすべてのsetter/getter関数に移動して繰り返す必要がありますMyPreferencesクラスのメソッドを呼び出す前に、必要な場所でそれを実行します。あなたがその解決策を提案している理由を述べることによって、私がより明確に理解するのを手伝ってください。

私はそれが非常にn00bの質問であることを知っています。許してください。私はJavaに非常に慣れていないので、概念を構築するだけです。

4

3 に答える 3

1

メソッドは明らかにステートフルです (エディタ フィールドへのアクセスが必要なため) ため、メソッドを静的メソッドとして実装することはお勧めできません。代わりに、クラス インスタンスを使用する必要があります。(静的メソッドは通常、ステートレスなユーティリティ関数です。つまり、入力が同じ場合、結果は常に同じです)。

毎回新しいオブジェクトをインスタンス化するか、Singleton パターンを実装できます。Singleton クラスは 1 回だけインスタンス化できます。それにアクセスするために、静的メソッド (getInstance) が提供されます。

于 2012-04-09T12:34:59.413 に答える
0

single instanceクラスを作成し、すべてのメソッドを非静的にし、そのインスタンスを取得するためのメソッドを作成するのはどうですか..

于 2012-04-09T12:26:16.870 に答える
0

おそらく、設定の getter/setter メソッドを定義するべきではありません: それらは冗長に見えます。設定にアクセスする必要があるクラスは、標準ctx.getSharedPreferences(...)など を呼び出すだけです。

タイトルで、リスナーが静的メソッドにリンクされていると主張していますが、あなたが示していることから、それが実際に当てはまるとは思いません。リスナーがゲッター/セッターを使用しない限り、標準的な方法で設定にアクセスする必要があります。

より一般的に言えば、クラス MyPreferences がまったく必要かどうかはわかりません。おそらく、リスナーを別のクラスのコンストラクターまたはメソッドに登録することができます。アプリ全体を見ていないので、適切かどうかわかりません。呼び出す場所をnew MyPreferences()調べて、メソッドが代わりに機能するかどうかを確認してください。

余談ですが、 と の初期化に静的初期化ブロックを使用することを考えましたが Contextが必要なため機能しません。settingseditorgetSharedPreferences

于 2012-04-09T13:19:24.003 に答える