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 :

Classe abstraite sans méthode abstraite ou classe normale sans constructeur visible ?


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Points : 102
    Points
    102
    Par défaut Classe abstraite sans méthode abstraite ou classe normale sans constructeur visible ?
    Bonjour,
    J'ouvre cette discussion pour avoir un avis sur une question.

    Dans le cas où une classe héritée par plusieurs autres classes déclare des variables et définit des méthodes non abstract pour ses enfants, mais qu'elle n'a aucune méthode abstract et que celle ci ne doit pas être instanciée, feriez vous une classe abstraite qui ne définit pas de méthode abstract ou une classe normale dont on met le constructeur en private ?

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Kikito
    Bonjour,
    J'ouvre cette discussion pour avoir un avis sur une question.

    Dans le cas où une classe héritée par plusieurs autres classes déclare des variables et définit des méthodes non abstract pour ses enfants, mais qu'elle n'a aucune méthode abstract et que celle ci ne doit pas être instanciée, feriez vous une classe abstraite qui ne définit pas de méthode abstract ou une classe normale dont on met le constructeur en private ?
    Salut,

    Je dirait classe abstraite.
    En effet, si tu mets une classe normale avec un constructeur privé, ca devient (presque) un singleton, il ne manquerai que la fonction getInstance().
    Or ton but n'est pas de faire un singleton mais bien de faire une classe racine, qui définit des fonctions communes.
    Je ne penses pas que le fait qu'il n'y ai pas de fonction abstraite soit un problème.

    Cordialement

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonjour,
    A mon avis tout dépend si cela a véritablement un sens d'avoir une instance de cette classe de base. Si elle ne peut pas être instanciée parce que les seules classes concrètes ne pourraient être que les classes dérivées, alors le mot clé abstract est fait pour ça, même si la classe ne déclare aucune méthode abstraite. Par contre, si l'objectif est d'empêcher toute instanciation de cette classe en dehors de la classe elle-même, c'est-à-dire que l'on ne pourrait obtenir une instance de cette classe qu'en appelant une méthode de la classe elle-même, alors un constructeur private rentre en jeu, tout en fournissant une méthode public permettant d'obtenir une instance de la classe. C'est d'ailleurs comme ça que le pattern Singleton est souvent implémenter.
    SCJP 5 / SCBCD 1.3 Certified

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Points : 102
    Points
    102
    Par défaut
    Merci de vos réponses, c'est donc bien ce que je pensais, dans mon cas une classe abstraite est le mieux et ça avait été mon premier réflexe, mais c'est vrai que ça me faisait bizarre de n'avoir aucune méthode abstract.

    Merci.

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    D'autant plus que, si je ne dis pas de bêtises, il est impossible d'hériter d'une classe concrète n'ayant que des constructeurs privés. Donc la classe abstraite est la seule solution.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Descent a écrit :
    D'autant plus que, si je ne dis pas de bêtises, il est impossible d'hériter d'une classe concrète n'ayant que des constructeurs privés. Donc la classe abstraite est la seule solution.
    Tout à fait !
    SCJP 5 / SCBCD 1.3 Certified

  7. #7
    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
    un constructeur protected c'est bien aussi.
    d'ailleurs j'ai tendance à penser que les classes abstraites ont quasi-automatiquement des constructeurs protected.
    votre 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)

  8. #8
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par professeur shadoko
    un constructeur protected c'est bien aussi.
    d'ailleurs j'ai tendance à penser que les classes abstraites ont quasi-automatiquement des constructeurs protected.
    votre avis?
    De toute façon, protected ou public, ça ne changera pas grand chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public abstract class A {
      protected A() {...}
      protected A(int i) {...}
    }
     
    A a = new A() {};
    A aa = new A(0) {};

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par professeur shadoko
    un constructeur protected c'est bien aussi.
    d'ailleurs j'ai tendance à penser que les classes abstraites ont quasi-automatiquement des constructeurs protected.
    votre avis?
    Qu'est-ce que ça change un constructeur public ou protected pour une classe abstraite?

    herve91, sur ton exemple, A est abstraite, tu peux pas faire new A()...

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ®om
    Qu'est-ce que ça change un constructeur public ou protected pour une classe abstraite?
    Cela ne change rien en effet...


    Citation Envoyé par ®om
    herve91, sur ton exemple, A est abstraite, tu peux pas faire new A()...
    Fais attention aux accolades derrière le new : {}
    Cela signifie qu'il s'agit d'une classe anonyme (et donc d'une classe fille)

    a++

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Fais attention aux accolades derrière le new : {}
    Cela signifie qu'il s'agit d'une classe anonyme (et donc d'une classe fille)
    Ah oui, bien vu, j'avais zappé la fin de la ligne

  12. #12
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Cela ne change rien en effet...
    D'ailleurs, le protected semble être promu en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package autrepackage;
     
    public abstract class AbstractClass {
     
        protected AbstractClass() {}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package unpackage;
     
    import autrepackage.AbstractClass;
     
    public class TestProtect {
     
        public static void main(String... args) {
            AbstractClass ac = new AbstractClass() {};
            // ça compile, alors que pas dans le même package (ni sous-classe)
        }
     
    }
    Ma conclusion est-elle bonne?

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ®om
    Ma conclusion est-elle bonne?
    Non car il s'agit d'une classe anonyme, et tu appelles le constructeur de la classe anonyme (qui doit correspondre à la classe unpackage.TestProtect$1) et non pas celui de la classe abstraite...

    Grosso modo ton code revient "presque" à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	 public static void main(String... args) {
    		class Anonyme extends AbstractClass {
    			// ...
    		}
    		;
    		AbstractClass ac = new Anonyme();
    	}
    a++

  14. #14
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Non car il s'agit d'une classe anonyme, et tu appelles le constructeur de la classe anonyme (qui doit correspondre à la classe unpackage.TestProtect$1) et non pas celui de la classe abstraite...

    Grosso modo ton code revient "presque" à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	 public static void main(String... args) {
    		class Anonyme extends AbstractClass {
    			// ...
    		}
    		;
    		AbstractClass ac = new Anonyme();
    	}
    a++
    OK merci de ces précisions

    Dans ton exemple, le constructeur (par défaut) de Anonyme, il est public?

  15. #15
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ®om
    Dans ton exemple, le constructeur (par défaut) de Anonyme, il est public?
    En fait il est de la même visibilité que la classe parente :



    En fait il y a deux cas de figure :


    Pour les classes "standard" sans constructeurs explicite, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MaClasse {
     
    }
    Un constructeur par défaut est implicitement généré par le compilateur. Il se contente d'appeler le constructeur de la classe parente (Object par défaut). Ce qui fait que le code ci-dessus est strictement équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MaClasse {
    	public MaClasse() {
    		super();
    	}
    }
    La visibilité du constructeur est la même que de la visibilité de la classe parente :
    http://java.sun.com/docs/books/jls/t...ses.html#8.8.9





    Pour les "classes anonymes" c'est différent car on ne peut pas y déclarer de constructeur explicite. Ainsi on ne pourrait pas écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	MaClasse instance = new MaClasse() {
    		MaClasse() {
    			// redéfinition du constructeur impossible
    		}
    	};
    En fait les classes anonymes on obligatoirement un constructeur implicite qui renvoi vers le constructeur de la classe parente avec les mêmes paramètres, c'est pourquoi avec une classe comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class MaClasseAbstraite() {
    	public MaClasseAbstraite(String name, int id) {
    		// ...
    	}
    }
    On peut faire une classe abstraite comme cela par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClasseAbstraite instance = new MaClasseAbstraite("maString", 0) {
    	// ...
    }

    Grosso modo le constructeur de la classe anonyme se contente de passer les paramètres au constructeur de la classe parente (MaClasseAbstraite ici).

    Ceci est également décrit ici :
    http://java.sun.com/docs/books/jls/t....html#15.9.5.1


    a++

Discussions similaires

  1. NoClassDefFound pour une inner classe dans une méthode de la classe
    Par joel.drigo dans le forum Général Java
    Réponses: 4
    Dernier message: 19/07/2013, 14h40
  2. Réponses: 7
    Dernier message: 24/02/2011, 13h15
  3. Classe abstraire sans méthode abstraite
    Par 0redd dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/08/2010, 23h42
  4. Réponses: 2
    Dernier message: 15/09/2009, 16h55
  5. Réponses: 23
    Dernier message: 16/03/2007, 20h21

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