"สวัสดี Amigo! วันนี้เราจะเรียนรู้เกี่ยวกับ หัวข้อที่น่าสนใจอื่น โดยเฉพาะการบันทึกและการโหลด (สร้างใหม่) ออบเจกต์ สมมติว่าเรามีคลาส 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());
    }
}

"ว้าว! ง่ายมาก! เราแค่เขียนค่าของแต่ละอาร์กิวเมนต์ หนึ่งค่าในแต่ละบรรทัด เมื่อเราโหลดไฟล์ เราจะอ่านค่าเหล่านั้นตามลำดับเดียวกัน มันเป็นโซลูชันที่สมบูรณ์แบบ"

"ขอบคุณ Amigo ตอนนี้คุณสามารถเขียนวิธีการบันทึกและโหลดสำหรับกลุ่มชั้นเรียนนี้:"

รหัส
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 = new Cat();
        cat.load(reader);
        dog = new Dog();
        dog.load(reader);
    }
}

"มันยังไม่ถูกต้องนัก คุณมีข้อผิดพลาดสองข้อ:"

1)คนอาจไม่มีแมวหรือสุนัข แต่พวกมันจะยังคงถูกสร้างขึ้นเมื่อมีการเรียกใช้เมธอดโหลด

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 = new Cat();
            cat.load(reader);
        }

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

"ใช่ ฉันชอบโซลูชันนี้"

"ใช่ มันดีมาก"