"Xin chào, Amigo! Hôm nay chúng ta sẽ tìm hiểu về một chủ đề thú vị khác. Cụ thể là lưu và tải (xây dựng lại) các đối tượng . Giả sử chúng ta có một lớp Cat:"

Mã số
class Cat
{
 public String name;
 public int age;
 public int weight;
}

Và giả sử chúng ta muốn thêm một cơ chế thuận tiện để lưu và tải từ một tệp.

Chúng ta có thể làm như thế này:

Mã số
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());
    }
}

"Chà! Thật dễ dàng! Chúng tôi chỉ viết các giá trị của từng đối số, mỗi đối số trên mỗi dòng. Khi tải tệp, chúng tôi đọc chúng theo cùng một thứ tự. Đó là giải pháp hoàn hảo."

"Cảm ơn, Amigo. Bây giờ bạn có thể viết các phương thức lưu và tải cho nhóm lớp này:"

Mã số
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;
}

Bạn có một đối tượng Người, có thể có một con chó và một con mèo.

"Tôi có cách này:"

Mã số
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());
    }
}
Mã số
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());
    }
}
Mã số
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);
    }
}

"Đó là một giải pháp rất tốt. Nhưng chuyện gì sẽ xảy ra nếu một người nuôi chó mà không nuôi mèo?"

kiểm tra null ở đâu?

"Tôi sẽ sửa nó ngay bây giờ:"

Mã số
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);
    }
}

"Vẫn chưa đúng lắm. Anh mắc hai lỗi:"

1) Một người có thể không có chó hoặc mèo, nhưng chúng vẫn sẽ được tạo khi phương thức tải được gọi

2) Nếu chúng ta chỉ lưu một con chó, dữ liệu của nó sẽ được đọc bởi con mèo khi nó được tải.

"Chà, tôi nên làm gì đây?"

"Chúng ta không thể bỏ qua việc ghi các biến, nếu không chúng ta sẽ gặp vấn đề trong quá trình đọc . Bạn cần đảm bảo rằng các biến không có giá trị trong quá trình lưu được đặt thành không có trong quá trình tải. Đây là phiên bản của tôi:"

Mã số
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);
        }
    }
}

"Vâng, tôi thích giải pháp này."

"Ừ, đẹp đấy."