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 :

Création d'une instance de classe dans la classe en cours de définition ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut Création d'une instance de classe dans la classe en cours de définition ?
    Bonjour à tous,

    J'étudie le code du design pattern singleton, dont voici une implémentation (trouvée dans les tutos de developpez.net) et j'ai une question à ce propos.

    code:

    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
    public class LazySingleton
    {
        private static final LazySingleton instance = new LazySingleton();
     
        private LazySingleton()
        {
            System.out.println("Construction du Singleton au premier appel");
        }
     
        public static final LazySingleton getInstance() 
        {
            return instance;
        }
     
        @Override
        public String toString()
        {
           return String.format("Je suis le LazySingleton : %s", super.toString());
        }
    }
    A la première ligne, comment est-ce possible de créer l'instance de type "LazySingleton" alors que la classe dont elle dépend est en cours de définition ???

    Il y a un concept que je ne dois pas saisir, mais lequel ?

    En vous remerciant.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Hello,

    Java est un langage compilé. D'abord on le compile vers des fichiers binaires, et ensuite on lance le programme.

    Ça veut dire que les lignes ne sont pas interprétées au fur et à mesure qu'on les rencontre, mais qu'elles décrivent, toutes ensemble à la fois, la définition de la classe.

    Puisque la définition est entièrement connue après compilation, rien n'empêche donc la classe d'appeler son propre constructeur et donc de créer des instances d'elle-même. Il faut juste éviter d'appeler son propre constructeur à l'intérieur de son propre constructeur : du coup chaque instance que tu crées va vouloir créer une autre instance et ça ne finit jamais. Ou alors il faut faire attention de bien prévoir des cas qui finissent.

    ... Bon et c'est pas de la magie. Les langages interprétés à la volée, qui ne nécessitent pas de précompilation, résolvent ce même problème de manière simple : quand ils tombent sur une classe, ils lisent la description entière de la classe, du début à sa fin, d'abord, et ils exécutent les instructions d'initialisation de la classe, ensuite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Salut

    Je te remercie infiniment pour ton explication complète

    Bonne journée.

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    je me pose la question suivante: est-ce que le message "construction au premier appel" n'est pas légèrement trompeur...
    Le code d'initialisation est exécuté au "load time" quand la classe est prise en compte et initialisée par le chargeur de classe.
    Il est garanti que ce code aura été exécuté quand on fera appel à getInstance() ... mais peut-il s'être exécuté avant?
    A mon avis oui dans certaines circonstances. Un autre avis?
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    'Suffit d'un Class.forName() ou d'un appel à un éventuel autre membre (mais pas une variable constante) que getInstance().

    Mais bon, ça n'a pas l'air très important en fait. C'est plus qu'on est garanti d'initialiser pas plus d'une fois, et que ça arrive avant qu'on appelle le getter vers l'instance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Création d'une instance (interface / class)
    Par vandeyy dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/03/2014, 18h47
  2. [Lazarus] [Linux] Erreur lors de la création d'une instance de classe héritée
    Par timmalos dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/05/2011, 12h59
  3. [WPF] Plantage lors de la création d'une instance de classe
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 14/09/2007, 14h31
  4. Réponses: 13
    Dernier message: 27/02/2007, 11h31
  5. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52

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