Когда жизнь дает вам гибкие объекты, обертка - ваш друг.
Ваш «XmlObject» идеально будет выглядеть так.
public class XmlObject {
final String type;
Map<String, ObjectWrapper> map = new Map<>();
public XmlObject(String type) {
this.type = type;
}
public void put(String key, ObjectWrapper object) {
map.add(key, object);
}
public ObjectWrapper get(String key) {
return map.get(key);
}
}
Затем ваша обертка использует Generics с возможностью возврата типа класса.
public class ObjectWrapper<T> {
private T value;
public ObjectWrapper (T value) {
this.value = value;
}
//from http://stackoverflow.com/a/8019188/2958086
public Class<T> getPersistentClass() {
if (persistentClass == null) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
return persistentClass;
}
}
Вы обеспечиваете тип объекта при объявлении, а также любого рода типа синтаксического анализа или преобразования данных, если это необходимо. Я предполагаю, что типы являются стандартными разборными типами, поэтому вы можете в процессе XML-анализатора обрабатывать и хранить на основе типа.
После этого вы можете получить объект на основе ключа или получить раскладку с использованием стандартных функций карты. Чтобы получить тип объекта, вы можете получить его постоянный класс.
По-разному, вы имеете в виду, что вы полностью отличаетесь или будете «Люди» всегда выглядят так? И тогда у вас может быть что-то вроде «Животных», которые будут иметь связанные с животными вещи. И этот открытый или закрытый XML, как вы могли бы получить неожиданный тип «Автомобили» по дороге, или вы уже знаете все типы? – Compass
Я не знаю всех типов. XML может различаться следующим образом: –