"Ciao, Amigo! Oggi parleremo di un altro argomento interessante. Nello specifico, salvare e caricare (ricostruire) oggetti . Supponiamo di avere una classe Cat:"

Codice
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:

Codice
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:"

Codice
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:"

Codice
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());
    }
}
Codice
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());
    }
}
Codice
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:"

Codice
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:"

Codice
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."