"Ciao, Amigo! Oggi parleremo di un altro argomento interessante. Nello specifico, salvare e caricare (ricostruire) oggetti . Supponiamo di avere una classe Cat:"
class Cat
{
public String name;
public int age;
public int weight;
}
E diciamo che vogliamo aggiungere un comodo meccanismo per salvare e caricare da un file.
Potremmo farlo in questo modo:
class Cat {
public String name;
public int age;
public int weight;
public void save(PrintWriter writer) throws Exception {
writer.println(name);
writer.println(age);
writer.println(weight);
writer.flush();
}
public void load(BufferedReader reader) throws Exception {
name = reader.readLine();
age = Integer.parseInt(reader.readLine());
weight = Integer.parseInt(reader.readLine());
}
}
"Wow! È così facile! Scriviamo solo i valori di ogni argomento, uno su ogni riga. Quando carichiamo il file, li leggiamo nello stesso ordine. È la soluzione perfetta."
"Grazie, Amigo. Ora puoi scrivere i metodi di salvataggio e caricamento per questo gruppo di classi:"
class Cat
{
public String name;
public int age;
public int weight;
}
class Dog
{
public String name;
public int age;
}
class Human
{
public Cat cat;
public Dog dog;
}
Hai un oggetto Umano, che può avere un cane e un gatto.
"Ho una soluzione:"
class Cat {
public String name;
public int age;
public int weight;
public void save(PrintWriter writer) throws Exception {
writer.println(name);
writer.println(age);
writer.println(weight);
writer.flush();
}
public void load(BufferedReader reader) throws Exception {
name = reader.readLine();
age = Integer.parseInt(reader.readLine());
weight = Integer.parseInt(reader.readLine());
}
}
class Dog {
public String name;
public int age;
public void save(PrintWriter writer) throws Exception {
writer.println(name);
writer.println(age);
writer.flush();
}
public void load(BufferedReader reader) throws Exception {
name = reader.readLine();
age = Integer.parseInt(reader.readLine());
}
}
public class Human {
public Cat cat;
public Dog dog;
public void save(PrintWriter writer) throws Exception {
cat.save(writer);
dog.save(writer);
}
public void load(BufferedReader reader) throws Exception {
cat.load(reader);
dog.load(reader);
}
}
"È un'ottima soluzione. Ma cosa succede se un essere umano ha un cane ma non un gatto?"
Dove sono i controlli nulli?
"Lo aggiusterò ora:"
public class Human {
public Cat cat;
public Dog dog;
public void save(PrintWriter writer) throws Exception {
if (cat != null)
cat.save(writer);
if (dog != null)
dog.save(writer);
}
public void load(BufferedReader reader) throws Exception {
cat = new Cat();
cat.load(reader);
dog = new Dog();
dog.load(reader);
}
}
"Non è ancora del tutto corretto. Hai due errori:"
1) Una persona potrebbe non avere un gatto o un cane, ma verranno comunque creati quando viene chiamato il metodo load
2) Se salviamo solo un cane, i suoi dati verranno letti dal gatto quando viene caricato.
"Bene, cosa dovrei fare?"
" Non possiamo saltare la scrittura delle variabili, altrimenti avremo problemi durante la lettura . Devi assicurarti che le variabili che sono nulle durante l'operazione di salvataggio siano impostate su null durante l'operazione di caricamento. Ecco la mia versione:"
public class Human {
public Cat cat;
public Dog dog;
public void save(PrintWriter writer) throws Exception {
String isCatPresent = cat != null ? "yes" : "no";
writer.println(isCatPresent);
writer.flush();
if (cat != null)
cat.save(writer);
String isDogPresent = dog != null ? "yes" : "no";
writer.println(isDogPresent);
writer.flush();
if (dog != null)
dog.save(writer);
}
public void load(BufferedReader reader) throws Exception {
String isCatPresent = reader.readLine();
if (isCatPresent.equals("yes")) {
cat = new Cat();
cat.load(reader);
}
String isDogPresent = reader.readLine();
if (isDogPresent.equals("yes")) {
dog = new Dog();
dog.load(reader);
}
}
}
"Sì, mi piace questa soluzione."
"Sì, è bello."
GO TO FULL VERSION