„Hallo Amigo! Heute werden wir uns mit einem weiteren interessanten Thema beschäftigen. Vor allem mit dem Speichern und Laden (Rekonstruieren) von Objekten. Angenommen, wir haben eine Cat-Klasse:“
class Cat
{
public String name;
public int age;
public int weight;
}
Und nehmen wir an, wir wollen einen praktischen Mechanismus zum Speichern in und Laden aus einer Datei hinzufügen.
Das könnten wir so machen:
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());
}
}
„Cool! Das ist so einfach! Wir schreiben einfach die Werte jedes Parameters, einen in jede Zeile. Wenn wir die Datei laden, lesen wir sie in der gleichen Reihenfolge. Es ist die perfekte Lösung.“
„Danke, Amigo. Jetzt kannst du die save- und load-Methoden für diese Klassengruppe schreiben:“
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;
}
Du hast ein Human-Objekt, das einen Hund und eine Katze haben kann.
„Ich habe eine Lösung:“
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);
}
}
„Das ist eine sehr gute Lösung. Aber was passiert, wenn ein Mensch einen Hund hat, aber keine Katze?“
Wo sind die Nullkontrollen?
„Ich bringe das jetzt in Ordnung:“
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);
}
}
„Es ist immer noch nicht ganz richtig. Du hast zwei Fehler:“
1) Eine Person hat vielleicht keine Katze oder keinen Hund, aber sie werden trotzdem erstellt, wenn die load-Methode aufgerufen wird.
2) Wenn wir nur einen Hund speichern, werden seine Daten von der Katze gelesen, wenn sie geladen wird.
„Was soll ich also tun?“
„Wir können das Schreiben der Variablen nicht überspringen, sonst werden wir Probleme beim Lesen haben. Du musst sicherstellen, dass Variablen, die während des Speichervorgangs null sind, während des Ladevorgangs auf null gesetzt werden. Hier ist meine Version:“
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);
}
}
}
„Ja, diese Lösung gefällt mir.“
„Stimmt, sie ist wirklich schön.“
GO TO FULL VERSION