Comment créer un singleton en Java ? Types d'initialisation, comparaison et points à retenir

Publié: 2020-10-07

Une classe singleton en Java est définie comme la classe qui n'a qu'un seul objet, c'est-à-dire une seule instance de la classe. La restriction de l'instance à une seule par classe aide à coder des programmes particuliers qui ne nécessitent qu'une seule instance de la classe. La seule instance d'une classe singleton reçoit un point d'accès global.

La classe Singleton est l'un des modèles de conception importants dans la programmation Java. Les classes singleton aident à limiter les ressources et à les optimiser ; il est beaucoup utilisé dans les connexions aux bases de données ou les sockets. Il existe des syntaxes d'implémentation pour la classe singleton, et un bon développeur doit le savoir. Voyons l'implémentation de la classe singleton en Java.

Apprenez les programmes d' ingénieur logiciel en ligne des meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.

Lire : Architecture et composants Java expliqués

Table des matières

Initialisation

L'initialisation d'un singleton en Java se fait via un constructeur privé. Les constructeurs privés aident les autres classes à ne pas pouvoir créer la même instance que celle de votre classe singleton. Il existe cinq types d'initialisation de classe singleton en Java, répertoriés ci-dessous :

1. Initialisation impatiente

Une méthode publique communément nommée getInstance() est créée. Cette méthode aidera à fournir un seul point d'entrée pour créer une instance de la classe, ce qui en fera une classe singleton. L'instance de la classe en initialisation hâtive est créée au moment du chargement de la classe.

Ce type de technique d'initialisation crée l'instance de la classe automatiquement, même si l'utilisateur ne l'utilise pas. Cela peut entraîner des problèmes de mémoire et une longueur inutile dans le code. Pour contrer le problème de fuite mémoire, voyons un autre type de technique d'initialisation pour une classe singleton en Java.

2. Initialisation paresseuse

L'instance de la classe est initialisée dans la méthode getInstance() elle-même en initialisation différée. La méthode en initialisation paresseuse vérifiera si l'instance de la classe est créée ou non et si elle n'est pas créée, alors seulement elle crée une instance, résolvant ainsi le problème de fuite de mémoire.

La méthode que l'on crée dans l'initialisation paresseuse est statique et a un objet de type retour. L'instance singleton en initialisation différée ne sera pas créée tant que la méthode getInstance() n'est pas appelée pour la première fois.

3. Initialisation paresseuse avec la méthode du double verrouillage

Cette méthode est utilisée lors de plus d'un thread. Si nous utilisons deux threads dans le programme, et que les deux sont accessibles via l'instruction 'if' en commençant lorsque l'instance est nulle, cela créera une situation de conflit et vous pourrez trouver des erreurs.

Ce problème est résolu par la méthode Double Lock dans laquelle un seul thread entre à la fois dans le bloc synchronisé pour l'initialisation de l'instance tandis que l'autre thread est bloqué. Lorsque le premier thread quitte le bloc synchronisé, seul le deuxième thread entre et crée une autre instance. Par défaut, le deuxième thread ne vérifie pas si l'instance est non nulle ou non.

4. Méthode de chargement paresseux

La classe interne imbriquée est créée dans cette méthode et fonctionne sur les principes de JLS (Java Language Specifications). Il n'y aurait pas de membres de données statiques dans la classe ; JVM ne créera pas d'instance de la classe. L'instance ne serait créée qu'à la demande lorsque nous invoquons la méthode getInstance().

Vous n'avez pas besoin de synchroniser la méthode d'initialisation et de chargement car cette méthode aide à la synchronisation automatique de toutes les invocations d'obtention d'Instance().

5. Méthode des énumérations

Plusieurs instances d'une classe singleton peuvent toujours être créées par sérialisation et réflexion dans les méthodes ci-dessus. Dans le cas de la création d'une classe singleton stricte, cette méthode peut être utilisée. Les champs Enums sont utilisés dans cette méthode qui est une constante et s'exécute uniquement au moment de la compilation.

Un Enum est l'instance du type Enum et sera construit uniquement lorsque le type Enum est invoqué/appelé pour la première fois dans le code. Cette méthode limite le clonage d'instance et crée une classe singleton parfaite.

Lisez aussi: Les 12 meilleurs programmes de modèles en Java que vous devriez vérifier aujourd'hui

Sérialisation et réflexion

La sérialisation aide au transport d'objets Java d'une JVM (Java Virtual Machine) à une autre. La sérialisation est l'une des méthodes utilisées pour créer plusieurs instances d'une classe. La sérialisation convertit l'objet en un flux d'octets, puis le transfert est effectué.

Le flux d'octets aide à recréer l'objet dans une autre JVM à l'aide du processus de désérialisation. Il aide plusieurs systèmes à communiquer et à partager des objets entre eux. Cela aide à la synchronisation entre JVM car les objets fonctionneront dans différentes JVM.

La réflexion est également une méthode de clonage d'objets en Java. La réflexion est une API qui nous aide à connaître la classe de tout objet inconnu et les méthodes de cette classe particulière accessibles via l'objet. La réflexion est largement utilisée par les programmeurs pour modifier le comportement des classes et des méthodes au moment de l'exécution.

Les trois commandes majeures utilisées en réflexion sont getClass() pour connaître la classe à laquelle appartient l'objet, getConstructors() pour obtenir les constructeurs publics de la classe de l'objet, getMethods() pour connaître les méthodes publiques de la classe observée.

Classe normale contre classe singleton

Une classe standard en Java utilise des constructeurs pour s'initialiser, alors que nous utilisons la méthode getInstance() pour initialiser une classe singleton. Nous pouvons également utiliser le même nom de classe et de méthode. Nous créons d'abord un objet pour les classes normales, puis nous utilisons ses méthodes et propriétés.

En revanche, dans une classe singleton, nous créons une instance en utilisant la propriété statique de la classe, et à tout moment du code, cette classe particulière ne renverra qu'une seule instance.

Outre les nombreux avantages des classes singleton, il existe également des failles telles que les méthodes de test d'unité de falsification des classes singleton si les objets et les méthodes sont étroitement couplés. Vous devrez dédier une classe entièrement fonctionnelle à un singleton dans ce cas.

Des dépendances cachées sont également parfois créées par la classe singleton, car la référence de la classe singleton est transmise à d'autres méthodes et n'est pas totalement transparente, ce qui rend difficile pour les codeurs/développeurs de suivre les méthodes et les classes. Il faut garder ces lacunes à l'esprit avant de créer un modèle singleton et essayer de les minimiser.

Points pour créer une classe singleton parfaite

1. Les points sur lesquels se concentrer pour créer une classe singleton parfaite sont les suivants :

2. Si vous créez plusieurs threads dans une classe singleton, assurez-vous que tous les threads ne doivent pas initialiser la classe singleton en même temps. On devrait essayer de créer des classes singleton thread-safe.

3. Assurez la preuve de réflexion de votre classe singleton en modifiant la visibilité du constructeur au public au moment de l'exécution et en vous assurant qu'il n'y a qu'une seule instance d'une classe singleton particulière.

4. S'il existe plusieurs threads, vous pouvez utiliser un modificateur volatil qui empêche un thread de consulter l'état initialisé des autres threads. Un modificateur volatil fonctionne sur la relation se produit avant dans laquelle l'écriture se produit dans un thread avant qu'un autre thread ne puisse le lire.

Doit lire: Idées de projets Java intéressantes pour les débutants

Conclusion

Les classes singleton sont utilisées pour établir des connexions personnalisées à la base de données ou à tout programme dans lequel vous souhaitez contrôler les méthodes et les instances de la classe.

Si vous souhaitez améliorer vos compétences en Java, vous devez mettre la main sur ces projets Java. Si vous souhaitez en savoir plus sur Java, le développement de la pile complète, consultez le programme exécutif PG de upGrad & IIIT-B en développement de logiciels - Spécialisation en développement de la pile complète qui est conçu pour les professionnels et offre plus de 500 heures de formation rigoureuse, 9 + projets et affectations, statut d'ancien de l'IIIT-B, projets de synthèse pratiques et aide à l'emploi avec les meilleures entreprises.

Devenir Développeur Full Stack

Postuler pour un Master of Science en informatique