"Hej, Amigo! Idag ska vi lära oss om ett annat intressant ämne. Specifikt, att spara och ladda (rekonstruera) objekt . Anta att vi har en Cat-klass:"
class Cat
{
public String name;
public int age;
public int weight;
}
Och låt oss säga att vi vill lägga till en bekväm mekanism för att spara till och ladda från en fil.
Vi skulle kunna göra så här:
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 är så enkelt! Vi skriver bara värdena för varje argument, ett på varje rad. När vi laddar filen läser vi dem i samma ordning. Det är den perfekta lösningen."
"Tack, Amigo. Nu kan du skriva spara och ladda metoderna för denna grupp 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 ett mänskligt föremål, som kan ha en hund och en katt.
"Jag 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 är en mycket bra lösning. Men vad händer om en människa har en hund men ingen katt?"
Var finns nollkontrollerna?
"Jag ska fixa 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 är fortfarande inte helt rätt. Du har två fel:"
1) En person kanske inte har en katt eller hund, men de kommer fortfarande att skapas när laddningsmetoden anropas
2) Om vi bara sparar en hund kommer dess data att läsas av katten när den laddas.
"Jaha, vad ska jag göra?"
"Vi kan inte hoppa över att skriva variablerna, annars får vi problem under läsningen. Du måste se till att variabler som är null under sparoperationen är inställda på null under laddningsoperationen. Här är 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, jag gillar den här lösningen."
"Ja, det är trevligt."
GO TO FULL VERSION