Как иметь переменные с динамическими типами данных в Java? - PullRequest
0 голосов
/ 21 мая 2010

Мне нужен класс UserProfile, это просто профиль пользователя. Этот профиль пользователя, конечно, содержит некоторые важные пользовательские данные, но ему также необходимо иметь списки сообщений, отправленных друзьями пользователя.

Мне нужно сохранить эти сообщения в LinkedList, ArrayList, HashMap и TreeMap. Но только по одному и не дублируйте сообщение для каждой структуры данных. По сути, что-то вроде типа динамической переменной, где я мог бы выбрать тип данных для сообщений.

Возможно ли это как-то в Java? Или мой лучший подход - это что-то вроде как это ? Я имею в виду, есть 2 разных класса (для профиля пользователя), один, где я размещаю сообщения как Map<K,V> (а затем я использую HashMap и TreeMap там, где это необходимо) и другой класс, где я размещаю их как List<E> (а затем я использую LinkedList и ArrayList, где это уместно). И, вероятно, используйте суперкласс для UserProfile, поэтому мне не нужно дублировать переменные и методы для таких полей, как данные, возраст, адрес и т. Д. *

Есть мысли?

Ответы [ 3 ]

1 голос
/ 21 мая 2010

Прежде всего, вы не дублируете сообщение, добавляя его в разные коллекции одновременно - вы сохраняете только отдельные ссылки на один и тот же объект.(Хорошо, если сообщение не представлено в виде примитивного типа, например long ... но его все равно нельзя добавить в коллекции.)

Почему вы не можете иметь все эти коллекции в одном и том же UserProfile??Это позволит вам получать доступ к сообщениям по ключу или индексу и выполнять их итерацию любым удобным для вас способом.

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

Обновление: @Snake, вы можете хранить только ссылки на объекты вКоллекции Java.Таким образом, примитивное значение long не может быть сохранено напрямую, только путем преобразования сначала в объект Long.Обратите внимание, что начиная с Java5, это преобразование может быть неявным из-за автобокса, поэтому вы не видите его в коде, но, тем не менее, это происходит - например,

List<Long> list = new ArrayList<Long>();
list.add(1L); // the primitive value is boxed into a Long object,
              // which is then added to the list
long value = list.get(0); // the value of the Long object in the list is outboxed
                          // and assigned to the primitive variable
0 голосов
/ 24 мая 2010

Я использовал то, что описал в первом посте:

Возможно ли это в Java?Или мой лучший подход - это что-то вроде этого?Я имею в виду, есть 2 разных класса (для профиля пользователя), один, где я размещаю сообщения как Map (а затем я использую HashMap и TreeMap, где это необходимо), и другой класс, где я размещаю их как List (а затем я использую LinkedList и ArrayListгде уместно).И, вероятно, используйте суперкласс для UserProfile, чтобы мне не приходилось дублировать переменные и методы для таких полей, как данные, возраст, адрес и т. Д. *

0 голосов
/ 21 мая 2010

Если это университетский проект, то я подозреваю, что вы должны это сделать:

Collection mycoll;
mycoll = new ArrayList();
for (Message m:message) {
  // do stuff and measure the performance
}
// do other stuff and measure the performance
mycoll = new LinkedList();
// do the same stuff as a above and measure the performance again
mycoll = new HashMap();
//... and so on

Как указано выше, добавление объекта в коллекцию не дублирует его.

...