Как правильно использовать дженерики? - PullRequest
2 голосов
/ 28 декабря 2010

Я в основном делаю веб-запросы и получаю ответ JSON. В зависимости от запроса я разбираю запрос JSON на созданные мной объекты. Синтаксический анализ практически одинаков, независимо от того, на что похож объект, который я анализирую. Итак, у меня есть куча методов, выполняющих одну и ту же работу только с разными объектами, мне было интересно, как я могу сделать это с помощью дженериков? Вот пример

   public static ArrayList<Contact> parseStuff(String responseData) {
ArrayList<Person> People = new ArrayList<Person>();
try {

    JSONArray jsonPeople = new JSONArray(responseData);
    if (!jsonPeople.isNull(0)) {
        for (int i = 0; i < jsonPeople.length(); i++) {
            People.add(new Person(jsonPeople.getJSONObject(i)));
        }

    }

} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {

}

return People;

}

Ответы [ 2 ]

3 голосов
/ 28 декабря 2010

Вам следует взглянуть на Effective Java 2, Item 29: Рассмотреть типы безопасных контейнеров гетерогенного типа

Основная идея заключается в том, что вы можете представить, что у вас есть Deserializer интерфейс.Тогда вы можете иметь Map<Class<?>, Deserializer<String, Object>>.Карта в основном представляет собой реестр от типа к правильному Deserializer для этого типа (который десериализуется из типа String (возможно, вам нужен тип json или что-то вместо String, но String работает) в тип интереса.

Реальная хитрость в том, что вы должны принудительно обеспечить соответствие типа ключа класса типу десериализатора, т. Е. - для некоторого класса, являющегося ключом на карте, в качестве значения используется десериализатор.это с помощью универсального метода. Например:

<T> void put(Class<T> clazz, Deserializer<String, T> deserializer) {
  map.put(clazz, deserializer);
}

Затем, чтобы использовать гетерогенную карту, вы можете снова использовать универсальный метод:

<T> T deserialize(Class<T> typeToDeserializeFromJson, String toDeserialize) {
  return typeToDeserializeFromJson.cast(
      deserializers.get(tTDFJ).deserialize(toDeserialize));
}

Вы используете тип, указанный ввызывающий метод для

  • поиска нужного `Deserializer`
  • десериализации текста json в` Object`
  • безопасно приведёт `Object` к нужному типу, который, как мы знаем, безопасен, потому чтоо том, как мы построили карту.

Я надеюсь, что то, что я сказал, было, по крайней мере, несколько ясным. Чтение соответствующей записи в EJ2 должно помочь!

ОБНОВЛЕНИЕ:

Как отмечает Абхинав , библиотека GSON поможет вам достичь вашей конечной цели десериализации объектов таким образом, чтобы использовать дженерики соответствующим образом.Тем не менее, я думаю, что ваш вопрос больше касается дженериков, чем конечной цели, поэтому я считаю, что мой ответ более уместен.GSON должен быть реализован с использованием контейнера гетерогенного типа: -).

Спасибо, Abhinav за указание на GSON!

1 голос
/ 28 декабря 2010

Я бы посоветовал вам использовать GSON вместо JSON. Это действительно упрощает вашу жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...