"Hei, Amigo! I dag skal vi lære om et annet interessant emne. Nærmere bestemt lagring og lasting (rekonstruere) objekter . Anta at vi har en Cat-klasse:"
class Cat
{
public String name;
public int age;
public int weight;
}
Og la oss si at vi vil legge til en praktisk mekanisme for å lagre til og laste fra en fil.
Vi kan gjøre det slik:
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å enkelt! Vi skriver bare verdiene til hvert argument, en på hver linje. Når vi laster filen, leser vi dem i samme rekkefølge. Det er den perfekte løsningen."
"Takk, Amigo. Nå kan du skrive lagrings- og lastemetodene for denne gruppen av 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 menneskelig objekt, som kan ha en hund og en katt.
"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 veldig god løsning. Men hva skjer hvis et menneske har en hund, men ingen katt?"
Hvor er nullsjekkene?
"Jeg skal fikse det nå:"
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 fortsatt ikke helt riktig. Du har to feil:"
1) En person har kanskje ikke en katt eller hund, men de vil fortsatt bli opprettet når lastemetoden kalles
2) Hvis vi bare lagrer en hund, vil dens data leses av katten når den er lastet.
"Vel, hva skal jeg gjøre?"
"Vi kan ikke hoppe over å skrive variablene, ellers får vi problemer under lesingen . Du må sørge for at variabler som er null under lagringsoperasjonen er satt til null under innlastingsoperasjonen. Her er min versjon:"
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 liker denne løsningen."
"Ja, det er fint."
GO TO FULL VERSION