web-dev-qa-db-ja.com

すべてのバンドルオブジェクトを反復処理する方法

すべての Bundle オブジェクトを generic の方法で反復するヘルパーメソッドを作成しようとしています。

「ジェネリック」とは、次のことを意味します。

  1. パラメータとして渡されたバンドル内のオブジェクトの名前(キー)を知っている必要はありません。
  2. バンドルに別のメンバー(キー)が将来追加された場合、変更する必要はありません。

これまでのところ、それを達成するために次の概要を理解しています。

  private void bundleToSharedPreferences(Bundle bundle) {
    Set<String> keys = bundle.keySet();
    for (String key : keys) {
        Object o = bundle.get(key);
        if (o.getClass().getName().contentEquals("int")) {
            // save ints
        }
        else if (o.getClass().getName().contentEquals("boolean")) {
            // save booleans
        }
        else if (o.getClass().getName().contentEquals("String")) {
            // save Strings
        }
        else {
            // etc.
        }
    } 
  }

このアプローチはまったく意味がありますか?

これを達成するためのより良い方法はありますか?

34
ateiob

もしそうするなら、私は反射を通してそれをするでしょう。 String.classがSharedPreference.putString()などにマップするように静的マップを格納します。次に、アイテムをループしているときに、マップに対してクラスをチェックします。それが存在しない場合は、スーパークラスなどを確認してください。これにより、呼び出す適切なメソッドが提供されるか、要求されたオブジェクトのタイプが設定に含めることができないものであることが通知されます。

したがって、基本的なアルゴリズムは次のとおりです。

  1. バンドルからオブジェクトを取得する
  2. クラスを取得
  3. クラスが地図にあるかどうかを確認する
  4. 含まれている場合は、指定されたメソッドを呼び出してSharedPreferencesに配置します。
  5. そうでない場合は、スーパークラスを取得し、手順3に戻ります。
  6. Java.lang.Objectに到達すると、すぐにSharedPreferencesに格納できないバンドルされたオブジェクトができます。途中でどのクラスにアクセスしたかに応じて、これも処理したい場合や、エラーを記録して次に進む場合があります。 whyがわからない場合、これを行っていると、メソッドが失敗したときにどのように対応するかを推測することは不可能です。バンドルと設定の両方を完全に制御しない限り、常にそうなりますが、その量の制御を取得できれば、これらのフープのすべてをジャンプする必要はありません。はるかに簡単で独自のフープを定義できるからです。キー。

注:リフレクションは高速ではなく、コーディングと保守が最も簡単な方法ではありません。可能であれば、私はあなたのユースケースに合うあまり一般的ではない方法を見つけることをお勧めします。

3
Ginger McMurray

ToString()メソッドを使用してすべてを文字列として保存できますか?プリミティブ型が同等のObjectにマップされているかどうか(たとえば、intからクラスIntegerへ)がわからない場合は、そうである場合、考えられる各クラスを手間をかけてチェックする代わりに、このようなことを実行できる可能性があります。

 for (String key : bundle.keySet()) {
        saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement
 }

これがあなたのニーズに合うかどうかはわかりませんが、私は今、バンドルをJSON文字列に変換するために同様のことをしようとしています。

72
Daniel