"สวัสดี 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);
}
}
}
"ใช่ ฉันชอบโซลูชันนี้"
"ใช่ มันดีมาก"
GO TO FULL VERSION