"Bună, Amigo! Astăzi vom afla despre un alt subiect interesant. Mai exact, salvarea și încărcarea (reconstruirea) obiectelor . Să presupunem că avem o clasă Cat:"

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

Și să presupunem că vrem să adăugăm un mecanism convenabil pentru salvarea și încărcarea dintr-un fișier.

Am putea face așa:

Cod
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! E atât de ușor! Scriem doar valorile fiecărui argument, câte unul pe fiecare linie. Când încărcăm fișierul, le citim în aceeași ordine. Este soluția perfectă."

"Mulțumesc, Amigo. Acum poți scrie metodele de salvare și încărcare pentru acest grup de clase:"

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

Ai un obiect uman, care poate avea un câine și o pisică.

"Am o solutie:"

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

"Aceasta este o soluție foarte bună. Dar ce se întâmplă dacă un om are un câine, dar nu are pisică?"

Unde sunt cecurile nule?

"O voi repara acum:"

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

"Totuși nu este tocmai corect. Ai două erori:"

1) O persoană s-ar putea să nu aibă o pisică sau un câine, dar acestea vor fi totuși create atunci când este apelată metoda de încărcare

2) Dacă salvăm doar un câine, datele acestuia vor fi citite de pisică atunci când este încărcat.

— Ei bine, ce ar trebui să fac?

Nu putem sări peste scrierea variabilelor, altfel vom avea probleme în timpul citirii . Trebuie să vă asigurați că variabilele care sunt nule în timpul operației de salvare sunt setate la nul în timpul operației de încărcare. Iată versiunea mea:”

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

— Da, îmi place această soluție.

— Da, e frumos.