40

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

「一般的な」とは、次のことを意味します。

  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.
        }
    } 
  }

このアプローチはまったく理にかなっていますか?

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

4

2 に答える 2

3

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

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

  1. バンドルからオブジェクトを取得する
  2. クラスを取得する
  3. クラスがマップにあるかどうかを確認する
  4. そうである場合は、指定されたメソッドを呼び出してそれを SharedPreferences に入れます。
  5. そうでない場合は、そのスーパークラスを取得して、手順 3 に戻ります。
  6. java.lang.Object までたどり着いた場合は、SharedPreferences にすぐに格納できないバンドルされたオブジェクトを取得しています。途中でヒットしたクラスに応じて、これも処理したい場合や、エラーを記録して先に進みたい場合があります。なぜこれを行っているのかを知らなければ、メソッドが失敗したときにどのように反応するべきかを推測することは不可能です。バンドルと設定の両方を完全に制御できない限り、常にそうなりますが、その量の制御があれば、これらすべてのフープをジャンプする必要はありません。キー。

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

于 2012-08-14T18:26:08.053 に答える