2014-12-13 3 views
0

Оригинальный код от here.
Глядя на код ниже (игнорируя операторы импорта):Создание уникальных переменных экземпляра объекта

public class JsonTest2 { 

public static void main(String[] args){ 
    Gson gson = new Gson(); 
    JsonParser jsonParser = new JsonParser(); 
    JsonReader reader = null; 

    try { 
    reader = new JsonReader(new InputStreamReader(new 
     FileInputStream("./twitterUser.json"))); 
    } 
    catch (IOException e) { 
    } 

    JsonArray userArray = jsonParser.parse(reader).getAsJsonArray(); 

    List<TwitterUser> twitterUsers = new ArrayList<TwitterUser>(); 
    //For each element in the JSON array, create a new TwitterUser 
    //and populate with the json data: 
    for (JsonElement aUser : userArray) { 
     TwitterUser aTwitterUser = 
      gson.fromJson(aUser, TwitterUser.class); 
     twitterUsers.add(aTwitterUser); 
    } 
    //For each new TwitterUser that was created, print them out: 
    for (TwitterUser tUser : twitterUsers) { 
     System.out.println(tUser); 
    } 
    } 
} 

Массив List twitterUsers = new ArrayList(); получает создан и содержит два экземпляра TwitterUser.

Как я могу ссылаться на каждый экземпляр отдельно (каково его имя переменной)? Если это невозможно, например. вы можете использовать только TwitterUser[0], как я могу использовать JSON для создания пяти объектов с именами отдельных переменных?
Возможно, потребуется немного объяснения вокруг предмета ...

+0

В ответ на «что такое имя переменной» свободный ответ «все, что вам нужно», но обратитесь к [учебнику по этому вопросу] (https://docs.oracle.com/javase/tutorial/ Java/nutsandbolts/variables.html). – gknicker

ответ

1

A List не является массивом. ArrayList - это List, который поддерживается массивом (к которому вы не можете получить доступ напрямую). Вместо того, чтобы использовать интерфейс List для

  1. List.get(int), который возвращает элемент в указанной позиции в этом списке.
  2. Используйте List.iterator() для итерации List, возможно косвенно с for-each loop.

Таким образом, в первом случае

TwitterUser tu = twitterUsers.get(0); // <-- get the first TwitterUser 
             //  in the List. 

или для второго

for (TwitterUser tu : twitterUsers) { 
    // do something with each TwitterUser in tu 
} 
+0

Ваш первый случай - это то, что я искал. Но он требует ручного подбора с именем для переменной экземпляра. Если бы существовал способ программно создавать переменные экземпляра типа 'TwitterUser1',' TwitterUser2' и т. Д. – jdurston

+1

И как бы вы к ним обращались? * Программно * как массив? Существует «Карта», которая может дать вам пары ключевых значений. –

+0

lol, да, точка взята. Я, вероятно, думаю о том, чтобы делать то, чего совершенно не нужно делать! – jdurston

0

Как ссылаться на каждый экземпляр индивидуально

Как twitterUsers[0] и twitterUsers[1] ,

(каково их имя переменной)?

Это не переменные, и у них нет имен.

Если это невозможно, например. вы можете использовать только TwitterUser [0], как я могу использовать JSON для создания пяти объектов с именами отдельных переменных?

Вы не можете. Переменная называет имена, которые вы пишете в исходном коде ... перед компиляцией. Класс библиотеки (такой как библиотека JSON, которую вы используете) может выполнять только во время выполнения ... после компиляции исходного кода.

Но если вы действительно хотите различные переменные, то легко написать код, чтобы сделать это, если вы знаете, точно как требуется много переменных; например

TwitterUser userOne = twitterUsers[0]; 
TwitterUser userTwo = twitterUsers[1]; 

Очевидно, что это трудно электромонтаж предположение, что есть (по крайней мере) два элемента в массиве JSON вы будете получать.


Это хорошая идея? Возможно, нет:

  • Не масштабируется.

  • Если количество переменных, которые необходимо заполнить, не является постоянным, ваш код становится довольно сложным и хрупким. (Вы можете инициализировать их null, но тогда придется иметь дело с возможными нулям каждый раз, когда вы используете переменные!)

  • Вы жестко проводниковая предположения, что обычно не должно быть зашитым. (Как минимум, вы должны убедиться, что количество элементов в массиве JSON соответствует вашим ожиданиям ... и относиться к неправильному допущению как к ошибке!)

  • Но в некоторых случаях это может сделать код более удобным для чтения ; например если именованные переменные (userOne и userTwo) будут широко использоваться или иметь более описательные имена.


Что об использовании карты вместо переменных? Он имеет масштаб (вид), но у вас все еще есть проблемы, когда количество записей в массиве является переменной. И код сложнее.

Смежные вопросы