"Hej, Amigo! I dag lærer vi om et andet interessant emne. Specifikt lagring og indlæsning (rekonstruering af) objekter . Antag, at vi har en Cat-klasse:"

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

Og lad os sige, at vi vil tilføje en praktisk mekanisme til at gemme til og indlæse fra en fil.

Vi kunne gøre det sådan her:

Kode
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! Det er så nemt! Vi skriver bare værdierne af hvert argument, en på hver linje. Når vi indlæser filen, læser vi dem i samme rækkefølge. Det er den perfekte løsning."

"Tak, Amigo. Nu kan du skrive gemme- og indlæsningsmetoderne for denne gruppe af klasser:"

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

Du har et menneskeligt objekt, som kan have én hund og én kat.

"Jeg har en løsning:"

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

"Det er en meget god løsning. Men hvad sker der, hvis et menneske har en hund, men ingen kat?"

Hvor er nulkontrollen?

"Jeg ordner det nu:"

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

"Det er stadig ikke helt rigtigt. Du har to fejl:"

1) En person har måske ikke en kat eller hund, men de vil stadig blive oprettet, når indlæsningsmetoden kaldes

2) Hvis vi kun gemmer en hund, vil dens data blive læst af katten, når den er læsset.

"Nå, hvad skal jeg gøre?"

"Vi kan ikke springe over at skrive variablerne, ellers får vi problemer under læsningen . Du skal sikre dig, at variabler, der er null under gemmeoperationen, er sat til null under indlæsningsoperationen. Her er min version:"

Kode
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, jeg kan godt lide denne løsning."

"Ja, det er dejligt."