— Привіт, Аміго! Сьогодні ми познайомимося із ще однією цікавою темою. А саме: збереженням та завантаженням (відновленням) об'єктів. Допустимо у нас є клас 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());
    }
}

— О! Це дуже просто. Ми просто друкуємо значення всіх аргументів, по одному в кожному рядку. А при завантаженні читаємо їх у тому самому порядку. Відмінне рішення.

— Дякую, Аміго. А можеш написати, як виглядатимуть методи save та load у такої групи класів:

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

— Дуже гарне рішення. Але що буде, якщо людина не має кота, а є тільки собака?

Де перевірки на null?

— Наразі виправлю:

Код
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 = новий Cat();
        cat.load(reader);
        dog = new Dog();
        dog.load(reader);
    }
}

— Все одно не дуже правильно. У тебе дві помилки:

1) Якщо людина не має ні кота, ні собаки, вони все одно будуть створені, при викликі методу load

2) Якщо ми збережемо тільки собаку, її дані будуть прочитані котом при завантаженні.

— А що робити?

— Ми не можемо пропускати запис змінних, інакше це спричинить збій під час читання. Але потрібно зробити так, щоб змінні, чиє значення було null при збереженні та після завантаження, отримували null. Ось мій варіант:

Код
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 = новий Cat();
            cat.load(reader);
        }

        String isDogPresent = reader.readLine();
        if (isDogPresent.equals("yes")) {
            dog = New Dog ();
            dog.load(reader);
        }
    }
}

— Так, мені подобається таке рішення.

— Так, щось у ньому є.