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

Langage Java Discussion :

déclaration sans "new"


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut déclaration sans "new"
    Désolé de poser une question qui pourrait être stupide mais je n'arrive pas à comprendre ce concept :

    quand on déclare un objet de sa propre classe, on fait :
    MaClasse test = new MaClasse();

    mais quand on déclare un objet venant du framework alors on fait ceci :
    Sequencer testSeq = MidiSystem.getSequencer();

    pourquoi n'emploie-t-on pas le mot-clé "new" ? testSeq n'est-il pas crée dans le memory heap ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Le new est appelé en interne de la classe MidiSystem.
    On utilise ce genre de procédé dans les patterns factory ou singleton.
    Dans le cas du singleton, c'est pour éviter d'avoir plusieurs instances de la même classe.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    merci !

    Si je regarde le tutoriel sur les design pattern dans la section factory, on a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class CanvasFactory 
    {
           public Point getPoint( int x, int y ) 
           {
                 return new PointImpl( x, y );
            }
    }
    Si on map cela avec mon exemple du MidiSystem, peut-on dire que :
    CanvasFactory correspond à MidiSystem
    getPoint correspond à getSequencer
    ?

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    en gros oui, mais c'est un peu plus compliqué.

    dans le cas de factory, le but est de séparer la création des objets du reste du code. Pourquoi? parce que créer un objet avec "new" c'est super rigide, impossible de changer le type de l'objet: "new" impose que l'on connaisse la classe qui sera utilisée.

    En utilisant factory, on délègue cette tâche à un autre agent (la "factory"), et comme cela c'est beaucoup plus facile de modifier la manière dont sont créés les objets: tu veux changer le mode de fonctionnement, bam tu créé une nouvelle factory, tu adaptes un peu le code qui permet de récupérer la factory, et c'est bon partout dans ton programme.

    Pour singleton, c'est plus simple: il y a plus ou moins la même notion que factory (déléguer l'instanciation à un agent), mais dans ce cas-là, on ne recherche pas la simplicité de changement, mais la garantie de n'avoir qu'une seule instance d'une classe partout dans le programme.

    On reconnait très facilement le pattern factory dans un programme java: le nom de la classe se termine presque toujours par "factory" (mais bon ça reste assez peu fréquent d'utiliser factory, c'est un pattern relativement lourd)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Merci pour vos explications sur les design patterns.

    pour revenir au framework, pourquoi avoir choisi cette méthode :
    Sequencer testSeq = MidiSystem.getSequencer();

    plutôt que celle-ci :
    Sequencer testSeq = new Sequencer();
    le système me dit "cannot instanciate the type Sequencer" => Pourquoi ?

    Pourtant, dans ce cas, on est sûr de la classe que l'on veut créer.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Et bien, comme expliqué précédemment, c'est pour n'avoir qu'une seule instance de l'objet en mémoire...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    OButterlin > Non ce n'est pas un singleton : chaque appel renvoi bien un nouvel objet...


    Citation Envoyé par Antonio81 Voir le message
    Pourtant, dans ce cas, on est sûr de la classe que l'on veut créer.
    Justement tu ne sais pas quelle classe tu vas utiliser Sequencer est une interface et ne peut donc pas être instancié !

    La méthode getSequencer() se charge de trouver la bonne classe selon ta configuration : chez moi elle renvoi un objet non-standard de type com.sun.media.sound.RealTimeSequencer. Il est donc probable que cette méthode renvoie un autre objet sur une autre JVM (et en particulier sur une JVM autre que Sun)

    Il est possible que la classe renvoyée varie selon plusieurs critères (mais je connais trop peu cette API pour citer ces critères).

    a++

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    en gros oui, mais c'est un peu plus compliqué.

    dans le cas de factory, le but est de séparer la création des objets du reste du code. Pourquoi? parce que créer un objet avec "new" c'est super rigide, impossible de changer le type de l'objet: "new" impose que l'on connaisse la classe qui sera utilisée.
    Pill_S, pourrais-tu s'il te plaît donner un exemple d'un cas où on ne connaîtrait pas la classe au moment de l'instanciation ?

    Est-ce là le seul avantage de la factory ?

  9. #9
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Bah typiquement, lorsque ton programme gère des plugins: tu ne sais pas à l'avance lesquels sont installés, donc tu ne peux pas les créer "statiquement".

    Et oui, le gros avantage de factory c'est vraiment d'éviter l'utilisation du mot clé "new", car le gros défaut de new, c'est qu'il faut connaitre précisément la classe ET le constructeur à invoquer lorsqu'on l'utilise (c'est vraiment très très rigide).

    Factory peut aussi être pratique pour garantir l'initialisation correcte d'objets, ou de graphes d'objets (structures d'objets se référençant les uns les autres), en permettant d'exécuter du code avant même l'appel des constructeurs (y'a des situations où les constructeurs ne devraient pas être invoqués sans que l'on soit certain qu'ils ne lèveront pas d'exception, factory permet de s'assurer de cela).

    Y'aurait encore des miliers de choses à dire sur factory, mais le mieux c'est de les découvrir soi-même

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

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