« J'aimerais discuter avec toi de l'initialisation d'objets. Lorsque tu crées un objet, tu dois attribuer des valeurs initiales à ses variables pour éviter les situations dans lesquelles tu accéderais à un objet qui ne dispose pas des informations dont il a besoin pour fonctionner correctement. »

« Considérons un objet Fichier. L'information minimale nécessaire pour un fichier est son nom. Il serait absurde de créer un fichier sans nom. »

« Supposons que nous écrivons une classe MonFichier pour travailler avec des fichiers. Quelles informations seraient nécessaires pour chaque objet ? »

« Le nom du fichier associé à l'objet ? »

« Exact. Pour ce faire, nous ajoutons la méthode initialiser() à notre classe. Voici à quoi ça ressemble. »

Exemple :
class MyFile
{
    private String filename = null;

    public void initialize(String name)
    {
        this.filename = name;
    }
…
}

« Nous avons ajouté la méthode initialiser pour rendre l'objet utilisable quand on l'appelle. Nous pouvons appeler les méthodes de l'objet immédiatement après avoir appelé la méthode initialiser. Si nous ne pouvons pas travailler avec un objet, nous disons qu'il est invalide ; il est valide dans le cas contraire. La tâche principale de la méthode initialiser est de recevoir toutes les données qu'un objet nécessite pour être valide. »

« Je vois. »

« Maintenant, nous allons rendre notre tâche plus difficile. Ou, à la réflexion, plus facile. C’est une question de point de vue. Supposons qu'un programmeur utilisant notre classe trouverait plus commode de passer simplement le répertoire du fichier et le nom court au lieu de son chemin complet. Nous pourrions créer une autre méthode initialiser (Java nous permet de créer plusieurs méthodes avec des noms identiques) pour permettre au programmeur de le faire. Voici à quoi notre classe ressemblerait : »

Exemple avec deux méthodes initialiser :
class MyFile
{
    private String filename = null;
    public void initialize(String name)
    {
        this.filename = name;
    }

    public void initialize(String folder, String name)
    {
        this.filename = folder + name;
    }

…
}

« Encore une chose : nous avons souvent besoin de créer une copie temporaire d'un fichier à côté de l'actuel. »

« Peut-on créer une méthode pour faire ça ? »

« Bien sûr. Regarde. »

Crée une copie à côté du fichier actuel :
class MyFile
{
    private String filename = null;
    public void initialize(String name)
    {
        this.filename = name;
    }

    public void initialize(String folder, String name)
    {
        this.filename = folder + name;
    }

   // The filename will be stored in the same directory as file. 
    public void initialize(MyFile file, String name) 
    {       
        this.filename = file.getFolder() + name;
    }

…
}

« Et je peux faire autant de ces méthodes que je veux ? »

« À condition d'être raisonnable. Bien que techniquement parlant, oui, autant que tu veux. »

« Quand dois-je appeler la méthode initialiser ? »

« Immédiatement après la création de l'objet, pour le rendre valide. »

Exemples :
MyFile file = new MyFile();
file.initialize("c:\data\a.txt");

String text = file.readText();
MyFile file = new MyFile();
file.initialize("c:\data\", "a.txt");

String text = file.readText();
MyFile file = new MyFile();
file.initialize("c:\data\a.txt");

MyFile file2 = new MyFile();
file2.initialize("a.txt");

String text = file2.readText();

« C'est quoi, cette méthode obtenirDossier() ? »

« Nous n'avons pas montré son code ici, en fait. Elle représente une méthode qui renvoie une chaîne avec le nom du dossier dans lequel notre fichier est stocké. »