« Bonjour, Amigo ! Aujourd'hui, nous allons découvrir un autre sujet intéressant. Plus précisément, l'enregistrement et le chargement (reconstruction) d'objets. Supposons que nous avons une classe Cat :

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

Et disons que nous voulons ajouter un mécanisme pratique pour l'enregistrement et le chargement à partir d'un fichier.

Nous pourrions le faire comme ceci :

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

« Ouah ! C’est super facile ! Nous écrivons simplement les valeurs de chaque argument, un sur chaque ligne. Lorsque nous chargeons le fichier, nous les lisons dans le même ordre. C'est la solution parfaite. »

« Merci, Amigo. Maintenant, tu peux écrire les méthodes d'enregistrement et de chargement pour ce groupe de classes : »

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

Tu as un objet Human, qui peut avoir un chien et un chat.

« J'ai une solution : »

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

« C'est une très bonne solution. Mais que se passe-t-il si un homme a un chien, mais pas de chat ? »

Où sont les contrôles de valeur null ?

« Je vais corriger ça tout de suite : »

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

« Ce n'est pas encore tout à fait ça. Il y a deux erreurs : »

1) Une personne peut ne pas avoir de chat ou de chien, mais elle sera quand même créée lors de l'appel de la méthode load

2) Si nous n'enregistrons qu'un chien, ses données seront lues par le chat lors du chargement.

« Alors comment faire ? »

« Nous ne pouvons pas sauter l'écriture des variables, sinon nous aurions des problèmes lors de la lecture. Nous devons nous assurer que les variables qui sont null lors de l'opération d'enregistrement sont définies sur null lors de l'opération de chargement. Voici ma version : »

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

« Oui, j'aime cette solution. »

« Je dois dire que je l'aime bien aussi. »