Java: получение объекта, связанного с enum
У меня есть ArrayList, полный пользовательских объектов. Мне нужно сохранить этот ArrayList в Bundle, а затем получить его позже.
Я потерпел неудачу как с Serializable, так и с Parcelable, теперь я просто пытаюсь каким-то образом сохранить объекты, связанные с индексами в ArrayList, затем проверяю их при восстановлении Bundle и добавлении объектов обратно.
Что у меня есть что-то вроде этого:
При сохранении пакета:
//Create temporary array of the same length as my ArrayList
String [] tempStringArray = new String[myList.size()];
//Convert the enum to a string and save it in the temporary array
for (int i = 0; i<myList.size();i++){
tempStringArray [i] = myList.get(i).getType(); //returns the enum in string form
}
//Write this to the Bundle
bundle.putStringArray("List", tempStringArray);
Итак, у меня теперь есть массив строк, представляющих типы перечисления объектов, которые были изначально в ArrayList.
Итак, при восстановлении Bundle я пытаюсь что-то вроде этого:
//Temporary string array
String[] tempStringArray = savedState.getStringArray("List");
//Temporary enum array
ObjectType[] tempEnumArray = new ObjectType[tempStringArray.length];
for (int i = 0; i<tempStringArray.length;i++){
tempEnumArray[i]=ObjectType.valueOf(tempEnemies[i]);
}
Итак, теперь у меня есть тип enum для каждого элемента, который изначально был в ArrayList.
То, что я сейчас пытаюсь сделать сейчас, это что-то вроде (будет идти внутри цикла for выше):
myList.add(tempEnumArray[i].ObjectTypeThisEnumRefersTo());
Очевидно, что описанный выше метод "ObjectTypeThisEnumRefersTo()" не существует, но в конечном итоге я пытаюсь это выяснить. Это возможно или, возможно, есть какой-то другой способ сделать это?
1 ответ
Чтобы получить значение enum типа enum типа enum из строки, используйте
Enemy.valueOf(String).
Enemy.valueOf("SPIDER") вернет Enemy.SPIDER, если ваш enum выглядит
enum Enemy { SPIDER, BEE};
РЕДАКТИРОВАТЬ: Оказывается, Zippy также имел фиксированный набор объектов Enemy, каждый из которых сопоставлен с каждым значением EnemyType, и ему нужен был способ найти Enemy из данного EnemyType. Мое предложение состоит в том, чтобы создать
HashMap<EnemyType, Enemy>
и поместите все объекты туда при создании, затем при десериализации преобразуйте строки в перечисляемые значения и перечислите значения в объекты Enemy, используя hashmap.
Позже мне пришло в голову, что, в зависимости от того, сколько логики у вас в Enemy, вы можете рассмотреть возможность удаления Enemy или EnemyType и объединить их в одно параметризованное перечисление, аналогично примеру с Planet здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html Это избавит вас от необходимости делать два шага от строки до конечного объекта и немного упростит вещи, так как вам не понадобится хэш-карта.