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 :

Bloc d'initialisation ou constructeur ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Par défaut Bloc d'initialisation ou constructeur ?
    Bonjour,

    Je viens d'apprendre l'existence des blocs d'initialisation en java, les static et ceux d'instance, qui s'écrivent respectivement "static {}" et "{}".

    Pour le bloc static d'initialisation je ne vois pas de conflit avec le constructeur, mais dans le bloc d'initialisation d'instance, je me demande 'comment définir si une action doit être réalisé dans le constructeur ou dans le bloc d'initialisation ?'

    Le livre que je lit ne l'expliquant pas ^-^.

    D'avance merci pour vos réponses

  2. #2
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Un grand classique du SCJP, la séquence est la suivante :
    1) Exécution partielle du constructeur appelé, jusqu'à l'appel (implicite ou non) du constructeur parent (super) inclu
    2) Exécution séquentielle des blocs d'initialisation selon leur ordre d'apparition
    3) Exécution de la suite du contenu du constructeur

    N'hésites pas à faire un test pour t'en convaincre

  3. #3
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    J'aurais une question sur le même thème. Je n'ai pas de doute sur l'intérêt du bloc static, mais quel est l'intérêt du bloc d'initialisation, car j'ai du mal à voir ce que ça peut apporter dans la pratique en plus du constructeur.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Le seul intérêt que je lui connaisse, c'est de pouvoir être entrelacé avec les déclarations de champs. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private Map<String,String> champ1 = new HashMap<String,String>();
    {
        champ1.put("clé","valeur");
        champ1.put("clé2","valeur2");
    }
    private int champ2 = champ1.size();
    Alors que le code du constructeur est exécuté d'office après toutes les initialisations par défaut. Note qu'on peut avoir plus propre en mettant tout à null par défaut et en créant une méthode init() appelée par le constructeur.

    Je crois que le bloc d'initialisation est surtout là pour raison de logique du language par rapport au bloc statique. En pratique, en 6 ans de java fulltime, je n'ai jamais eu besoin du bloc d'initialisation, alors que j'ai déjà eu besoin plusieurs fois du bloc d'initialisation statique.

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Ok dans ce cas là, en effet ça peu servir mais çà reste plus lisible de tout faire dans le constructeur.

    j'avais aussi vu une utilisation très particulière comme alternative au chainage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonObjet objet = new MonObjet();
    objet.setProperty1(1);
    objet.setProperty2(1);
    objet.setProperty3(1);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonObjet objet = new MonObjet(){{
        setProperty1(1);
        setProperty2(1);
        setProperty3(1);
    }};
    Mais là ça revient à détourner utiliser une structure de son réel but avec en plus une perte d'efficacité, vu qu'on se traine une création de classe anonyme.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Uther Voir le message
    Mais là ça revient à détourner utiliser une structure de son réel but avec en plus une perte d'efficacité, vu qu'on se traine une création de classe anonyme.

    A rajouter qu'une inner class anonyme rend d'office impossible l'existance de champs privés dans la classe englobante, seul moyen qu'a l'inner class d'avoir accès à tous les champs de l'outer class.

Discussions similaires

  1. Initialisation de bloc vs Constructeur
    Par Chavadam dans le forum Langage
    Réponses: 8
    Dernier message: 31/08/2009, 17h36
  2. Réponses: 6
    Dernier message: 26/06/2006, 23h49
  3. Constructeur et Initialisation
    Par dazz_x dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2006, 08h48
  4. Réponses: 4
    Dernier message: 18/05/2006, 09h56
  5. Réponses: 35
    Dernier message: 14/02/2006, 18h57

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