"Hej, Amigo! I dag lærer vi om et andet interessant emne. Specifikt lagring og indlæsning (rekonstruering af) objekter . Antag, at vi har en Cat-klasse:"
class Cat
{
public String name;
public int age;
public int weight;
}
Og lad os sige, at vi vil tilføje en praktisk mekanisme til at gemme til og indlæse fra en fil.
Vi kunne gøre det sådan her:
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());
}
}
"Wow! Det er så nemt! Vi skriver bare værdierne af hvert argument, en på hver linje. Når vi indlæser filen, læser vi dem i samme rækkefølge. Det er den perfekte løsning."
"Tak, Amigo. Nu kan du skrive gemme- og indlæsningsmetoderne for denne gruppe af klasser:"
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 har et menneskeligt objekt, som kan have én hund og én kat.
"Jeg har en løsning:"
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);
}
}
"Det er en meget god løsning. Men hvad sker der, hvis et menneske har en hund, men ingen kat?"
Hvor er nulkontrollen?
"Jeg ordner det nu:"
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);
}
}
"Det er stadig ikke helt rigtigt. Du har to fejl:"
1) En person har måske ikke en kat eller hund, men de vil stadig blive oprettet, når indlæsningsmetoden kaldes
2) Hvis vi kun gemmer en hund, vil dens data blive læst af katten, når den er læsset.
"Nå, hvad skal jeg gøre?"
"Vi kan ikke springe over at skrive variablerne, ellers får vi problemer under læsningen . Du skal sikre dig, at variabler, der er null under gemmeoperationen, er sat til null under indlæsningsoperationen. Her er min 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, jeg kan godt lide denne løsning."
"Ja, det er dejligt."
GO TO FULL VERSION