"Hallo, Amigo! Vandaag leren we over een ander interessant onderwerp. Met name het opslaan en laden (reconstrueren) van objecten . Stel dat we een Cat-klasse hebben:"

Code
class Cat
{
 public String name;
 public int age;
 public int weight;
}

En laten we zeggen dat we een handig mechanisme willen toevoegen voor het opslaan in en laden van een bestand.

We zouden het zo kunnen doen:

Code
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());
    }
}

"Wauw! Dat is zo eenvoudig! We schrijven gewoon de waarden van elk argument, één op elke regel. Als we het bestand laden, lezen we ze in dezelfde volgorde. Het is de perfecte oplossing."

"Bedankt, Amigo. Nu kun je de methoden voor opslaan en laden voor deze groep klassen schrijven:"

Code
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;
}

Je hebt een menselijk object, dat één hond en één kat kan hebben.

"Ik heb een oplossing:"

Code
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());
    }
}
Code
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());
    }
}
Code
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);
    }
}

"Dat is een heel goede oplossing. Maar wat gebeurt er als een mens wel een hond heeft maar geen kat?"

Waar zijn de nulcontroles?

"Ik zal het nu oplossen:"

Code
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);
    }
}

"Het klopt nog niet helemaal. Je hebt twee fouten:"

1) Een persoon heeft misschien geen kat of hond, maar ze worden nog steeds gemaakt wanneer de laadmethode wordt aangeroepen

2) Als we alleen een hond redden, worden zijn gegevens gelezen door de kat wanneer deze wordt geladen.

"Nou, wat moet ik doen?"

"We kunnen het schrijven van de variabelen niet overslaan, anders krijgen we problemen tijdens het lezen . Je moet ervoor zorgen dat variabelen die null zijn tijdens het opslaan, op null worden gezet tijdens het laden. Dit is mijn versie:"

Code
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);
        }
    }
}

"Ja, ik hou van deze oplossing."

"Ja, het is leuk."