"Szervusz, Amigo! Ma egy másik érdekes témáról fogunk tanulni. Pontosabban az objektumok mentése és betöltése (rekonstrukciója) . Tegyük fel, hogy van egy Cat osztályunk:"
class Cat
{
public String name;
public int age;
public int weight;
}
Tegyük fel, hogy szeretnénk hozzáadni egy kényelmes mechanizmust a fájlba való mentéshez és a fájlból való betöltéshez.
Ezt így is megtehetnénk:
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());
}
}
"Hűha! Ez olyan egyszerű! Csak minden argumentum értékét írjuk, minden sorba egyet. Amikor betöltjük a fájlt, ugyanabban a sorrendben olvassuk be őket. Ez a tökéletes megoldás."
"Köszönöm, Amigo. Most már megírhatja a mentési és betöltési metódusokat ehhez az osztálycsoporthoz:"
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;
}
Van egy emberi tárgya, amelyben lehet egy kutya és egy macska.
"Van megoldásom:"
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);
}
}
"Ez egy nagyon jó megoldás. De mi történik, ha az embernek van kutyája, de macskája nincs?"
Hol vannak a null ellenőrzések?
"Most megjavítom:"
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);
}
}
"Még mindig nincs rendben. Két hibája van:"
1) Előfordulhat, hogy egy személynek nincs macskája vagy kutyája, de a load metódus meghívásakor továbbra is létrejönnek
2) Ha csak egy kutyát mentünk meg, akkor annak adatait a macska beolvassa a betöltéskor.
– Nos, mit tegyek?
" Nem hagyhatjuk ki a változók írását, különben problémáink lesznek az olvasás során . Győződjön meg arról, hogy a mentési művelet során nulla változók nullára vannak állítva a betöltési művelet során. Íme az én verzióm:"
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);
}
}
}
– Igen, tetszik ez a megoldás.
– Igen, szép.