13 29 Singleton
À ce stade, notre interface JavaFX de liste de tâches fonctionne, mais elle reste limitée : les éléments sont codés en dur dans le contrôleur. Un utilisateur réel s'attend à ajouter ses propres tâches et à les retrouver à la réexécution de l'application. Nous allons donc introduire un mécanisme pour charger et sauvegarder les TodoItems dans un fichier texte plat. Le contrôleur a besoin des données pour remplir la liste, et la classe Main doit pouvoir les enregistrer via la méthode stop que l'on peut override depuis la classe Application.
Pourquoi un Singleton
Pour partager les données entre la classe Main et le contrôleur, nous utilisons un Singleton. Cela garantit qu'une seule instance de la classe existe pendant toute l'exécution. Le constructeur reste privé pour empêcher toute autre instanciation, et une méthode statique getInstance() expose l'unique instance. Ainsi, Main et Controller accèdent simplement et de manière cohérente aux mêmes TodoItems.
Dans le package modèle de données, nous créons la classe TodoData. À l'intérieur, nous déclarons une instance statique privée : private static TodoData instance = new TodoData(). Nous ajoutons aussi un nom de fichier statique private static String filename = "TodoListItems.txt", une liste privée todoItems pour stocker les éléments, et un DateTimeFormatter pour manipuler les dates. La méthode publique statique getInstance() retourne l'instance, et le constructeur privé initialise le formateur de dates au format jour/mois/année.
Nous ajoutons ensuite les getter et setter pour la liste, puis une méthode loadTodoItems() qui lève une IOException. Nous utilisons la syntaxe try/finally classique : todoItems = FXCollections.observableArrayList(), puis nous récupérons le chemin avec Path path = Paths.get(filename) et préparons un BufferedReader. La vidéo s'arrête ici sur cette mise en place du lecteur tamponné ; la suite couvrira la boucle de lecture, le parsing des champs et la méthode d'écriture dans la prochaine vidéo.
En résumé
Cette leçon explique le pattern Singleton en Java, un pattern de conception permettant de créer une unique instance d'une classe sur toute l'exécution de l'application. Dans un contexte d'application JavaFX de gestion de tâches, le singleton est utilisé pour faciliter l'accès partagé aux données entre la classe Main et le contrôleur, particulièrement pour la sauvegarde et le chargement des tâches depuis un fichier plat.
Points clés
- Le pattern Singleton garantit qu'une seule instance d'une classe existe pendant toute l'exécution de l'application
- La classe singleton utilise un constructeur privé pour empêcher toute autre classe de créer des instances supplémentaires
- Une méthode statique publique (getInstance) permet à n'importe quelle classe d'accéder à l'unique instance sans créer de nouvelles instances
- Dans cette application, le singleton stocke la liste des tâches (TodoData) et fournit un point d'accès centralisé pour les données utilisées par la classe Main et le contrôleur
- Le singleton facilite la persistance des données en enregistrant les tâches dans un fichier plat, préservant ainsi les données entre les fermetures et réouvertures de l'application
Questions fréquentes
Pourquoi utiliser le pattern Singleton plutôt que de passer les données directement entre la classe Main et le contrôleur ?
Le singleton offre une solution rapide et pratique pour que les deux classes accèdent aux mêmes données sans nécessiter de passage de paramètres complexe. Il crée un point d'accès centralisé et global aux données partagées.
Comment le constructeur privé du singleton empêche-t-il la création d'autres instances ?
Le constructeur privé rend impossible l'instanciation de la classe de l'extérieur. Seule la classe elle-même peut créer l'instance unique, qui est stockée dans une variable statique (instance).
Quel est le rôle de la méthode getInstance() ?
La méthode getInstance() est la seule manière pour d'autres classes d'accéder à l'instance unique du singleton. Elle retourne la variable statique instance, permettant à la classe Main et au contrôleur d'utiliser les mêmes données.