Подтвердить что ты не робот

Итерация через все объекты Bundle

Я пытаюсь создать вспомогательный метод, который будет проходить через все Bundle объекты в общий способ.

Под "общим" я имею в виду:

  • Не нужно знать имена (ключи) объектов в Bundle, переданных как параметр.
  • Не нужно изменять, если в будущем в Bundle был добавлен другой член (ключ).

До сих пор я выяснял следующий план:

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

Этот подход имеет смысл вообще?

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Я бы сделал это через размышления, если бы я сделал это вообще. Храните статическую карту таким образом, чтобы String.class отображался в SharedPreference.putString() и т.д. Затем, когда вы перебираете элементы, проверяйте их класс на карте. Если этого не существует, проверьте суперкласс и т.д. Это либо даст вам надлежащий метод для вызова, либо сообщит вам, что запрошенный тип объекта не является тем, что может быть помещено в предпочтения.

Итак, основной алгоритм:

  • Получить объект из пакета
  • Получить класс
  • Посмотрите, находится ли класс на карте
  • Если это так, вызовите указанный метод, чтобы поместить его в SharedPreferences
  • Если это не так, получите суперкласс и вернитесь к шагу 3.
  • Если вы дойдете до java.lang.Object, у вас есть связанный объект, который не может быть немедленно сохранен в SharedPreferences. В зависимости от того, какие классы вы попали по пути, который вы, возможно, захотите попытаться обработать, или просто захотите записать ошибку и перейти дальше. Не зная, почему вы это делаете, невозможно угадать, как вы должны реагировать, когда метод терпит неудачу. Это неизменно будет, если у вас нет полного контроля над пакетом и предпочтениями, но если у вас есть такой контроль, вам не нужно перепрыгивать через все эти обручи, потому что вы можете быть гораздо более простыми и просто определить свои собственные ключи.

Примечание: отражение не быстрое, и это не самая простая вещь для кодирования и поддержки. Если это вообще возможно, я бы рекомендовал найти более общий метод, подходящий для вашего прецедента.

Ответ 2

Не могли бы вы сохранить все как String с помощью метода toString()? Не знаю, сопоставляются ли примитивные типы с их эквивалентами объектов (например, int для класса Integer), но если они есть, то вы можете сделать что-то подобное, вместо того, чтобы тщательно проверять каждый возможный класс.

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

Не уверен, что это сработает для ваших нужд, но я пытаюсь сделать что-то похожее для преобразования пакета в строку JSON прямо сейчас.