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 :

Probleme d'initialisation via classe abstraite


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut Probleme d'initialisation via classe abstraite
    Salut les gens,

    Voici un petit bout de code tout simple :

    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
     
    public abstract class AbstractClass {
        protected AbstractClass() { init(); }
        protected void init() { }
    }
     
    public class ClassImpl extends AbstractClass {
        private String var;
     
        public ClassImpl(String var) { this.var = var; }
     
        protected void init() {
            super.init();
            System.out.println("var=[" + var + "]");
        }
    }
    Si je fais "new ClassImpl("coucou")", ça affiche "var=[null]".

    "Logique" quand on y réfléchit, mais pas génial quand on veut avoir deux méthodes init() afin de dissocier l'initialisation de la classe abstraite et l'initialisation de la classe concrète.

    En fait, j'aimerais éviter d'appeler explicitement init() dans le constructeur de ClassImpl...quel est selon-vous la meilleure façon de résoudre ce problème ?

    PS : non, je ne souhaite pas supprimer les méthodes init() et mettre le code directement dans le constructeur.

    Merki !

  2. #2
    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
    Salut,

    Citation Envoyé par sc_wizard29 Voir le message
    PS : non, je ne souhaite pas supprimer les méthodes init() et mettre le code directement dans le constructeur.
    C'est pourtant la meilleure solution...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    C'est pourtant la meilleure solution...


    a++
    Certes, sauf que dans mon code, j'ai en réalité plusieurs méthodes nommées initXX(), initYY() & initZZ() qui sont chacune relativement longues.

    Du coup, avoir le constructeur de la classe abstraite qui appelle ces 3 méthodes à la suite est plus lisible qu'avoir un constructeur qui fait 50 lignes.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ce qui est important c'est que les classes filles ne redéfinissent pas ces méthodes. Autrement dit, de "faire comme si" elles étaient entièrement dans le constructeur. Il suffit de les nommer autrement d'une classe à l'autre, ou de les faire private.

    Bien sûr, ça signifie que chaque constructeur doit appeler sa liste de méthodes à appeler.

    Edit : Ah, et bien sûr il ne faut pas de déclaration abstraite de ces méthodes, puisqu'elles ne doivent pas être redéfinies.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Rends les privées Ca reviendra au même que de copier/coller le code.
    Tu peux également te passer de méthodes en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class FooBar {
      {
         // initXXX()
      }
      {
        // initYYY()
      }
      {
        // initZZZ()
      }
    }
    Pour ton problème il n'y a pas de solution, tu essayes de violer un paradigme objet (initialiser la classe fille durant l'initialisation de la classe mère).

    Dans Log4j ils ont décidés que la méthode "init" ne serait appelé qu'après construction et initialisation de l'objet.

    Autre solution passé en paramètre au constructeur de la classe mère les paramètres du constructeur de la classe fille qui seront ensuite passé à la méthode init.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  6. #6
    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
    Citation Envoyé par sc_wizard29 Voir le message
    Certes, sauf que dans mon code, j'ai en réalité plusieurs méthodes nommées initXX(), initYY() & initZZ() qui sont chacune relativement longues.
    Dans ce cas il est préférable de passer ces méthodes en private et de les appeler dans le constructeur de la classe en question.

    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
    public abstract class AbstractClass {
        protected AbstractClass() { init(); }
        private void init() { }
    }
     
    public class ClassImpl extends AbstractClass {
        private String var;
     
        public ClassImpl(String var) {
            this.var = var;
            init();
        }
     
        private void init() {
            System.out.println("var=[" + var + "]");
        }
    }
    Un constructeur ne devrait pas utiliser ses méthodes virtuelles, car lors de son exécution l'objet n'est pas forcément complètement initialisé...


    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut
    Merci à tous pour vos réponses,

    Il semble effectivement plus judicieux d'appeler explicitement la méthode init() dans chacun des constructeurs.

    A la base je cherchais une solution pour "éviter" de le faire, mais force est de constater que ça ne marche pas ;-)

Discussions similaires

  1. Initialiser une classe Java via un tableau d'octets
    Par Biloute88 dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 27/07/2012, 15h43
  2. Probleme d'initialisation dans une classe
    Par AirSounet dans le forum Débuter
    Réponses: 5
    Dernier message: 27/06/2011, 16h50
  3. Probleme sur classe abstraite argument non reconu
    Par Nono Sto dans le forum Débuter
    Réponses: 4
    Dernier message: 07/02/2011, 18h50
  4. Probleme sur une classe Classe abstraite
    Par Nono Sto dans le forum Débuter
    Réponses: 3
    Dernier message: 29/01/2011, 21h58
  5. Probleme pour initialiser une classe
    Par geodev dans le forum NetBeans
    Réponses: 1
    Dernier message: 09/12/2010, 22h13

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