Jump to content
×
×
  • Create New...

Java SINGLETON


Calypso
 Share

Recommended Posts

  • Retraité

Niveau requis Intermédiaire

Temps estimé : 30 minutes

Salut tout le monde !

 

Me revoilà pour un petit tutoriel JAVA qui vous sera peut être très utile encore une fois. Je vais vous expliquer le principe du SINGLETON.

 

 

SINGLETON c'est quoi ? Et ça sert à quoi ?

 

Révélation

 

Le singleton est un design pattern (patron de conception). Un design pattern c'est une solution générique pour un problème de conception. C'est une sorte de modèle. 

 

Imaginons que vous développez une application sous JAVA, vous vous dîtes: Ha si je met cet objet ici, je vais avoir le même problème que l'autre fois ou encore: Ha tiens, si le programme repasse par là, il va instancier une nouvelle fois cette class et moi je ne veux pas, ça me le fait tout le temps, c'est chiant.  Dans ces cas là, vous faites un design pattern pour éviter que ce problème se reproduise ... (enfin, si vous être intelligent !)

 

Le SINGLETON en JAVA est donc un design pattern qui vous permet d'assurer l'existence d'une et unique instance. Prenons un cas de figure : Vous avez développé un programme en JAVA. Dès que vous lancez le .jar, votre programme va directement instancier une class. Si par erreur, le programme vient à instancier une nouvelle fois cette class, il risque de provoquer plusieurs anomalies. Et bien SIGLETON vous permet d'être sûr à 100% qu'une seule instance existe. Et je vous avoue que dans certain cas, c'est très pratique !

 

 

Comment l'utiliser ?

 

Révélation

 

Je vais prendre un exemple avec vous :

    private static class SingletonHolder {

        protected static final AccountService instance = new AccountService();
    }
On ne peut pas instancier cette class car elle est déclaré comme private ! Le seul moyen est de passer par la méthode :
    
public static AccountService getInstance() {

        return SingletonHolder.instance;
    }
Si on appelle cette méthode, elle va nous renvoyer une instance de type AccountService. Ce qui donnerait à la fin :
public class AccountService {

    private AccountService() { // Constructeur de la class AccountService par défaut

    }

   public static AccountService getInstance() {   //Revoit une instance de type AccountService

        return SingletonHolder.instance;
    }

    private static class SingletonHolder {  
        protected static final AccountService instance = new AccountService();  //Instancie la class AccountService
    }
}
Haha, voici la puissance du SINGLETON !

 

 

Extra
 

Révélation

 

Il existe d'autres façon d'utiliser le SINGLETON, comme par exemple :

 public class Singleton {

  private static Singleton instance ;

  private Singleton() {
  }

  public static Singleton getInstance() {
     if (instance == null) {
        instance = new Singleton() ;
     }
     return singleton ;
  }
}
Instance va stocké l'unique instance de cette class. Si test est null, alors instancie la class. Une fois que ca class sera instancier, test la contiendra. Il sera donc impossible de l'instancier une nouvelle fois. Allez-y, vous pouvez essayer !
 

 

 

C'est la fin du tutoriel. Si vous souhaitez un approfondissement sur un point, n'hésitez pas. Si vous avez des améliorations à proposer, n'hésitez pas aussi. (je suis pas pro en JAVA, donc oui, je risque de faire des erreurs ..)

 

Bonne soirée ou bonne journée,

 

Cordialement,

Hey hey

  • J'adore 1
Link to comment
Share on other sites

  • Replies 3
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

  • Retraité

Salut,

Après en avoir un peu discuté avec toi hier soir, ta première implémentation du singleton est déjà un peu plus claire. Je n'avais jamais vu cette idée d'encapsuler l'instance dans une 'sous-classe', c'est original.

Ta deuxième implémentation, la plus connue, est en revanche incomplète : la condition if(test == null) doit se trouver dans une méthode publique getInstance() qui renvoie l'attribut test (à nommer bien entendu instance dans un vrai programme) juste après la condition. Il est aussi possible de déclarer l'attribut instance comme une variable statique au sein même de la méthode getInstance() (si les variables statiques de fonction existent bien en java, mais il me semble que oui) ; tout le code du singleton étant ainsi concentré dans une méthode. Ça peut faire un peu fourre-tout, mais permet de ne pas consacrer trop de lignes et donc obscurcir le code pour cet aspect 'utilitaire', afin de mieux se concentrer sur la fonction de la classe.

Enfin, une implémentation plus évoluée de ce pattern serait une classe Singleton permettant l'implémentation du pattern dans d'autres classes par leur simple héritage de Singleton. Les templates C++ permettent de faire ça relativement simplement mais j'ignore si ces derniers existent en Java (ou tout autre moyen) pour pouvoir coder une telle classe.

 

Par ailleurs, tu peux développer un peu plus  l'utilité mais aussi le principal défaut (selon moi) de ce pattern en parlant de la portée globale qu'il apporte à l'instance de la classe sujette au singleton : une méthode statique étant accessible partout où sa classe est incluse au même titre que qu'une fonction statique, l'instance de l'objet qu'elle délivre devient donc une variable quasi globale.

C'est très utile pour certaines classes comme un Logger qui nécessite d'être disponible en tout point du code, mais attention à ne pas abuser du Singleton uniquement pour pouvoir accéder facilement à un objet ; argument qui est généralement le principal 'justifiant' l'utilisation du Singleton dans de nombreux cas. Une application correctement conçue détient normalement une hiérarchie de classe structurée qui limite et définie clairement l'interdépendance de celles-ci : les instances nécessaires à une classe devraient lui êtres transmises de façon explicite (visibles dans l'interface de la classe) (sauf dépendances récurrentes comme le Logger) et si celle-ci nécessite trop de classes extérieures, c'est sûrement que sa fonction n'est pas clairement définie et 'limitée' et qu'elle fait un peu tout mais pas grand chose au final.

Pour avoir moi même trop souvent utilisé ce pattern à tort & à travers, je sais qu'il apparaît très souvent être la meilleure solution à nos problèmes  mais ne fait que déplacer nos soucis en obscurcissant le code final. En réfléchissant un minimum sur les raisons vous poussant à l'utiliser, vous verrez que vous pouvez généralement parfaitement vous en passer en passant un peu plus de temps sur la conception.

Moi même je me rends bien compte de ces points là mais pour autant une bonne conception est loin d'être facile à mettre en place. Il n'y a qu'à taper 'singleton are evil' sur google et vous aurez sans doute de meilleures explication sur le moment où ils sont nécessaires et quand ils ne le sont pas.

Je ne dis donc pas qu'il ne faut pas utiliser de Singleton, seulement qu'il faut faire attention à l'utilisation que vous en faites !

 

Bref, en tout cas merci beaucoup pour ton investissement dans cette section Calypso, continue ainsi ;)

Link to comment
Share on other sites

  • Retraité

Merci pour ton commentaire :)

J'ai corrigé le deuxième point et j'ai changé l'explication sur le getInstance() (en me relisant, j'ai pleuré comme dirait Sparks)

 

Je suis entrain d'approfondir la première partie (l'appel de l'instance avec une fonction) pour bien vous faire comprendre son utilité.

Link to comment
Share on other sites

 Share



  • Flux d'Activité

    1. 1

      Antares2.to | modern Old-/Middleschool | START 07.10.22 | International Server

    2. 0

      Projet Genesis

    3. 4

      Shiva.international serveur privé metin2 Oldschool Start 16.09.2022

    4. 0

      Metin2 Champions - Accès anticipé

    5. 0

      Barbok

    6. 4

      Shiva.international serveur privé metin2 Oldschool Start 16.09.2022

    7. 2

      Partage Émulateur 2.63

  • Recently Browsing

    • No registered users viewing this page.

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.