IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Comprendre le Singleton


Sujet :

avec Java

  1. #1
    Membre du Club Avatar de stefan73
    Homme Profil pro
    Formateur : OpenOffice.org/LibreOffice
    Inscrit en
    Mai 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Formateur : OpenOffice.org/LibreOffice
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut Comprendre le Singleton
    Bonjour,

    Je reviens vers vous pour utiliser un singleton. (J'en comprends l''utiliter)

    Mais c'est le mécanisme qui est pour moi encore un peu abscon !


    J'ai trouvé pleins de tutoriels sur Developpez et sdz

    Mais je suis toujours dans l'incompréhension de comment l'appeler

    J'ai créé un projet test sous Netbeans avec deux classe
    - 1er main.java
    - 2e singleton.java

    Exemple du singleton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    /**
     *
     * @author stefan
     */
    public class Singleton {
        private String name = "";
        private static String url = "jdbc:sqlite:test.db";
     
        private static Connection connect;
     
    /**
     
            /**
             * Constructeur privé
             */
    	private Singleton(){
    		try {
    			connect = DriverManager.getConnection(url);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
     
    	/**
             * Méthode qui va nous retourner notre instance
             * et la créer si elle n'existe pas...
             * @return
             */
    	public static Connection getInstance(){
    		if(connect == null){
    			new Singleton();
    		}
    		return connect;	
    	}	
     
        }
    Et dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    import java.sql.Connection;
     
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    /**
     *
     * @author stefan
     */
    public class main {
     
        public static void main(String[] args) {
            try {
    			Statement rs = Connection.getInstance().prepareStatement("SELECT * FROM mytable");
     
                //Affichage des résultats
     
                while (rs.next()) {
                    int id = rs.getInt(1);
                    String name = rs.getString(2);
                    System.out.println("Id = " + id + ", nom = " + name);
                }
     
                //Fermeture de la connexion à la base
     
     
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     
    }
    et j'ai une une erreur au niveau du getInstance() ?

    je suis un peu perdu. si vous pouviez me remettre sur les rails


    Merci

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par stefan73 Voir le message
    et j'ai une une erreur au niveau du getInstance() ?

    je suis un peu perdu. si vous pouviez me remettre sur les rails
    Que dit ton erreur ? A première vue, ton singleton respecte la syntaxe :
    - l'instance de la classe en attribut "private static"
    - un getter de l'instance en "public static"
    - au sein du getter, une vérification si l'instance de classe est null, si oui, création de l'instance

    Et au sein de ton main(), ton singleton est correctement appelé.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tu t'es trompé de nom de classe. C'est Singleton.getInstance()

    Par ailleurs, ce n'est pas le sujet, mais il faudrait déclarer connect avec volatile, sinon il peut y avoir conflit en cas de plusieurs threads :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static volatile Connection connect;
    Bon, et puis quand on y réfléchit, une seule connexion SQL pour toute une application, en général, c'est bof.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club Avatar de stefan73
    Homme Profil pro
    Formateur : OpenOffice.org/LibreOffice
    Inscrit en
    Mai 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Formateur : OpenOffice.org/LibreOffice
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    voici l'erreur
    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - exception java.lang.ClassNotFoundException is never thrown in body of corresponding try statement
    at main.main(main.java:24)
    Java Result: 1
    Une capture d'écran de la classe main.
    Images attachées Images attachées  

  5. #5
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tu t'es trompé de nom de classe. C'est Singleton.getInstance()
    Ah oui j'suis con tout simplement
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  6. #6
    Membre du Club Avatar de stefan73
    Homme Profil pro
    Formateur : OpenOffice.org/LibreOffice
    Inscrit en
    Mai 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Formateur : OpenOffice.org/LibreOffice
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Merci à vous deux.

    quand à mon erreur (c'est ça quand on reprends des classe sur le web sans bien comprendre le fonctionnement) ;(

    Il me reste encore une erreur à résoudre et je vous laisse tranquille

    merci à vous
    Images attachées Images attachées  

  7. #7
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bon, et puis quand on y réfléchit, une seule connexion SQL pour toute une application, en général, c'est bof.
    +1, pour moi c'est l'exemple typique d'une mauvaise utilisation des Singleton que tout le monde veut mettre partout. Tu vas garder ta référence de connexion alors que ce n'est pas forcément nécessaire... de plus le getInstance() qui renvoie un autre type que le Singleton lui même c'est un peu strange
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bon alors plusieurs remarques:

    1) le volatile, désolé, mais inutile dans le cas présent. L'instance est privée et donc nécessite de passer par une méthode, donc d'office il n'y a rien de mis en cache dans les registres (nettoyage en début de méthode)

    2) En général, un Singleton retourne une instance de lui même et pas une instance d'autre chose.

    3) Tu crée un constructeur que tu n'appelle que pour ses effets de bord, mauvais design

    3) Ce n'est pas comme ça qu'on instancie proprement un singleton. La méthode recommandée pour éviter les soucis entre les thread c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Singleton {
        private static Singleton instance = new Singleton();
        public Singleton getInstance(){return instance;}
    }
    4) Une connexion globale, c'est la dernière des plus mauvaise idée. Que vous fassiez un singleton pour stocker vos informations de connexion, à la rigueur, mais pas une connexion unique pour toute la durée de vie de l'application.

    5) Evitez les constructeur ou les méthodes d'instance qui manipulent des champs statiques. Laissez les statiques aux méthodes statiques et les champs d'instance aux instances. chacun de son coté et tout ira bien

  9. #9
    Membre du Club Avatar de stefan73
    Homme Profil pro
    Formateur : OpenOffice.org/LibreOffice
    Inscrit en
    Mai 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Formateur : OpenOffice.org/LibreOffice
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    OK !

    Comment dire, je suis encore plus dans la confusion qu'avant de poser ma question cétait pas le but ! mais au moins j'ai plusieurs avis sur le Singleton

    je vais juste me faire une tit application pour gérer ma compta, gestion, factures...


  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Dans le cas d'une connexion à une base de données, ce n'est pas la connexion qui doit être contenue dans le singleton, mais une classe dont le rôle est de créer des connexions à la volée et de fournir des instances des classes permettant la récupération des données depuis la base (classe appelée communément Factory).

    En général cela rentre dans le cadre du pattern DAO expliqué dans le tutoriel suivant: http://cyrille-herby.developpez.com/...c-pattern-dao/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Le but du singleton est d'avoir une seule instance d'une classe par classloader et utilisable par d'autres classes de l'application.
    Donc, on créé une classe et on masque le constructeur par private (histoire de ne pas pouvoir faire un new LaClasse()).
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public MaClasse
    {
       private static MaClasse maClasse;
     
       private MaClasse()
       {
          ...
       }
     
       public static MaClasse getInstance()
       {
          if (maClasse == null)
          {
             maClasse = new MaClasse();
          }
          return maClasse;
       }
     
       public UnType uneMethodeUtile(...)
       {
          ...
          return unType;
       }
    }
    la méthode getInstance() permet de récupérer l'instance "unique" de MaClasse. La première fois, maClasse est NULL donc on créé l'instance.

    Pour l'utilisation, l'appel se fait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public UneAutreClasse
    {
       public void uneMethode(...)
       {
          UnType leType = MaClasse.getInstance().uneMethodeUtile();
          ...
       }
     
    }
    Généralement, on utilise le singleton pour des classes utilitaires, utilisées partout.
    Pour le cas de l'acquisition d'une connexion à la DB, on peut utiliser le principe.

    Petit complément au cas où...

    Une méthode ou une propriété static n'a pas besoin d'instance pour être accessible. Elle est cependant limitée aux propriétés et méthodes static.
    Donc, MaClasse.getInstance() est accessible sans instance de MaClasse.
    getInstance() retourne une instance de MaClasse.
    Comme cette méthode centralise l'accès et la création de l'instance, on n'a qu'une seule instance de MaClasse après le premier appel de getInstance().
    L'instance de MaClasse peut utiliser toutes les propriétés et méthodes de la classe, static ou non.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre du Club Avatar de stefan73
    Homme Profil pro
    Formateur : OpenOffice.org/LibreOffice
    Inscrit en
    Mai 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Formateur : OpenOffice.org/LibreOffice
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Merci je vais digérer tout cela !

    stefan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 01h55
  2. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 14h02
  3. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05
  4. [debutant]Singleton
    Par bafman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2004, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo