"Merhaba Amigo! Bugün başka bir ilginç konuyu öğreneceğiz. Özellikle nesneleri kaydetme ve yükleme (yeniden yapılandırma) . Diyelim ki bir Cat sınıfımız var:"

kod
class Cat
{
 public String name;
 public int age;
 public int weight;
}

Ve bir dosyaya kaydetmek ve dosyadan yüklemek için uygun bir mekanizma eklemek istediğimizi varsayalım.

Bunu şu şekilde yapabiliriz:

kod
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());
    }
}

"Vay canına! Çok kolay! Her argümanın değerini her satıra bir tane yazıyoruz. Dosyayı yüklediğimizde aynı sırayla okuyoruz. Mükemmel çözüm."

"Teşekkürler Amigo. Artık bu sınıf grubu için kaydetme ve yükleme yöntemlerini yazabilirsiniz:"

kod
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;
}

Bir köpeği ve bir kedisi olabilecek bir İnsan nesneniz var.

"Bir çözümüm var:"

kod
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());
    }
}
kod
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());
    }
}
kod
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);
    }
}

"Bu çok iyi bir çözüm. Peki ya bir insanın köpeği varken kedisi yoksa ne olur?"

Boş çekler nerede?

"Şimdi düzelteceğim:"

kod
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);
    }
}

"Hala tam olarak doğru değil. İki hatan var:"

1) Bir kişinin kedisi veya köpeği olmayabilir, ancak load yöntemi çağrıldığında yine de yaratılacaktır.

2) Sadece bir köpeği kurtarırsak, yüklendiğinde verileri kedi tarafından okunacaktır.

"Peki, ne yapmalıyım?"

" Değişkenleri yazmayı atlayamayız, yoksa okuma sırasında sorun yaşarız . Kaydetme işlemi sırasında null olan değişkenlerin, yükleme işlemi sırasında null olarak ayarlandığından emin olmanız gerekir. İşte benim versiyonum:"

kod
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);
        }
    }
}

"Evet, bu çözümü beğendim."

"Evet, güzel."