"Hej, Amigo! Idag ska vi lära oss om ett annat intressant ämne. Specifikt, att spara och ladda (rekonstruera) objekt . Anta att vi har en Cat-klass:"

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

Och låt oss säga att vi vill lägga till en bekväm mekanism för att spara till och ladda från en fil.

Vi skulle kunna göra så här:

Koda
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 är så enkelt! Vi skriver bara värdena för varje argument, ett på varje rad. När vi laddar filen läser vi dem i samma ordning. Det är den perfekta lösningen."

"Tack, Amigo. Nu kan du skriva spara och ladda metoderna för denna grupp av klasser:"

Koda
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 ett mänskligt föremål, som kan ha en hund och en katt.

"Jag har en lösning:"

Koda
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());
    }
}
Koda
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());
    }
}
Koda
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 är en mycket bra lösning. Men vad händer om en människa har en hund men ingen katt?"

Var finns nollkontrollerna?

"Jag ska fixa det nu:"

Koda
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 är fortfarande inte helt rätt. Du har två fel:"

1) En person kanske inte har en katt eller hund, men de kommer fortfarande att skapas när laddningsmetoden anropas

2) Om vi ​​bara sparar en hund kommer dess data att läsas av katten när den laddas.

"Jaha, vad ska jag göra?"

"Vi kan inte hoppa över att skriva variablerna, annars får vi problem under läsningen. Du måste se till att variabler som är null under sparoperationen är inställda på null under laddningsoperationen. Här är min version:"

Koda
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, jag gillar den här lösningen."

"Ja, det är trevligt."