"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:"
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:
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:"
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:"
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);
}
}
"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:"
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:"
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."
GO TO FULL VERSION