2016-04-13 1 views
0

В настоящее время у меня есть программа, которая может сохранять и загружать ArrayLists типа «Variable» из файла. Однако я хотел бы иметь возможность сохранять и загружать разные объекты (экземпляры разных классов, такие как «Переменные», «Функции» и т. Д.) Только из одного файла. Вот код, который у меня есть сейчас:Сохранение/загрузка нескольких ArrayLists в один файл в Java

public SaveState(){ 
    ObjectOutputStream out = null; 
    try { 
     out = new ObjectOutputStream(new FileOutputStream("vars.stt")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    ArrayList<Variables> vars = new ArrayList<>(); 
    vars.add(new Variables("g", 5)); 
    vars.add(new Variables("f", -3.12)); 
    try { 
     out.writeObject(vars); 
     out.flush(); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

public LoadState(){ 
    ObjectInputStream in = null; 
    try { 
     in = new ObjectInputStream(new FileInputStream("vars.stt")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     //final Object o = in.readObject(); 
     final ArrayList<Variables> vars = (ArrayList<Variables>) in.readObject(); 
     System.out.println(vars.toString()); 
    } catch (IOException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Этот код позволяет мне загрузить только один тип объекта из файла. Есть ли способ сохранить/загрузить несколько типов объектов таким образом?

+0

Вы не попробовали сделать базовый класс для функций и переменных и использовать список массивов типа Base Class? –

+0

@ImeshaSudasingha Честно говоря, я не уверен, смогу ли я это сделать, это потребует от меня рефакторирования большого количества моего кода (сотни строк). Есть другое решение. – Arman

+0

Нет, вы просто можете создать некоторый базовый класс (скажем, «ProgramElement»), они просто увеличивают класс Variables и Functions от него. Не нужно реорганизовывать код. –

ответ

1

Вы можете просто использовать карту, содержащую архаристов или функций. Карта также хороша с точки зрения производительности.

Map<String, List> map = new HashMap<String, List>(); 
    map.put("variable", arralist1); 
    map.put("functions", arralist2); 
    map.put("list", arralist3); 
+0

Итак, это сработает, даже если ArrayLists имеют разные типы? – Arman

+0

Да. Или вы можете использовать дженерики, чтобы сделать его параметризованным. – KayV

+0

Большое спасибо за это решение. Он отлично работал – Arman

2

Создать иерархию классов, как это:

//base class. No need to write any content 
class ProgramElement { 

} 

//your variables class 
class Variables extends ProgramElement { 
    //your code 
} 

//your functions class 
class Functions extends ProgramElement { 
    //your code 
} 

//your lists class 
class Lists extends ProgramElement { 
    //your code 
} 

затем использовать ArrayList типа ProgramElement. Запомнить Список здесь не ваш список классов. Это интерфейс списка Java.

List<ProgramElement> elements = new ArrayList<>(); 
elements.add(aFunction); //add function object 
elements.add(aList); //lists object 
elements.add(aVariable); //variables object 

Примечание: Вы можете достичь того же с помощью списка типа Object. Но это не рекомендуется, так как это не очень хорошая практика.

+0

Большое спасибо, сначала я думал, что вы говорите мне что-то делать по строкам «class ProgramElement extends Variables, Functions, Lists {}« Вот где я запутался. Еще раз спасибо. – Arman

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