"Здравей, Амиго! Днес ще научим за друга интересна тема. По-конкретно, запазване и зареждане (реконструиране) на обекти . Да предположим, че имаме клас Cat:"

Код
class Cat
{
 public String name;
 public int age;
 public int weight;
}

И да кажем, че искаме да добавим удобен механизъм за запазване във и зареждане от файл.

Можем да го направим така:

Код
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());
    }
}

"Уау! Това е толкова лесно! Ние просто записваме стойностите на всеки аргумент, по една на всеки ред. Когато зареждаме file, ние ги четем в същия ред. Това е идеалното решение."

„Благодаря, Амиго. Сега можете да напишете методите за запазване и зареждане за тази група класове:“

Код
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;
}

Имате човешки обект, който може да има едно куче и една котка.

„Имам решение:“

Код
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());
    }
}
Код
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());
    }
}
Код
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);
    }
}

„Това е много добро решение. Но Howво се случва, ако човек има куче, но няма котка?“

Къде са нулевите проверки?

„Сега ще го оправя:“

Код
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);
    }
}

„Все още не е съвсем правилно. Имате две грешки:“

1) Човек може да няма котка or куче, но те пак ще бъдат създадени, когато се извика методът за зареждане

2) Ако запазим само куче, неговите данни ще бъдат прочетени от котката, когато се зареди.

— Е, Howво да правя?

Не можем да пропуснем записването на променливите, в противен случай ще имаме проблеми по време на четене . Трябва да се уверите, че променливите, които са null по време на операцията за запис, са зададени на null по време на операцията за зареждане. Ето моята version:“

Код
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);
        }
    }
}

„Да, харесвам това решение.“

— Да, хубаво е.