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 :

Difference entre Class Abstraite et interface


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2006
    Messages : 194
    Par défaut Difference entre Class Abstraite et interface
    Salut tout le monde,
    J'ai un ensemble de constante à déclarer pour l'utiliser dans mon apllication,
    est-ce que je doi utiliser un interface comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Interface Constante{
    public static final String CONSTANTEA ="moiMeme"; 
    public static final String CONSTANTEB ="unAutre";
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Abstract class Constante{
    public static final String CONSTANTEA ="moiMeme"; 
    public static final String CONSTANTEB ="unAutre";
    }
    Laquelle je doit utiliser?
    C'est quoi la différence en terme de performance et de point de vue BestPricteces?
    Merci pour l'aide

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Pour moi, la best practice est de ne pas utiliser de public static final Je les remplace toujours par des private static final.

    Je pense que c'est mieux en java de réfléchir dans le cadre d'instances ; par exemple ici je mettrais à tout le moins objet.getConstanteA(), ou des enums, ou autre d'adapté. Et, surtout, englober le ou les traitements correspondant à cette constante dans la classe ; j'essaierai d'englober tous les traitements correspondants à constanteA dans une classe. (donc une instance).

    Sinon pour ta question je pense que c'est l'approche par interface la meilleure, en tous cas la plus courante.

    Je reproche à l'approche par public final static d'être peu robuste aux modifs, et d'être static.

    Maintenant, le mieux étant l'ennemi du bien, cela m'arrive quelques fois de le faire quand j'ai pas envie de réfléchir.

  3. #3
    Membre expérimenté Avatar de Vikisme
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2007
    Messages : 172
    Par défaut
    Citation Envoyé par gifffftane
    Pour moi, la best practice est de ne pas utiliser de public static final Je les remplace toujours par des private static final.
    Bah ça dépend de ce que tu veux faire... Exemple la constante JFrame.EXIT_ON_CLOSE elle est bien mieux en public que privée...

    Citation Envoyé par gifffftane
    Je pense que c'est mieux en java de réfléchir dans le cadre d'instances ; par exemple ici je mettrais à tout le moins objet.getConstanteA(), ou des enums, ou autre d'adapté. Et, surtout, englober le ou les traitements correspondant à cette constante dans la classe ; j'essaierai d'englober tous les traitements correspondants à constanteA dans une classe. (donc une instance).
    Bah je ne suis pas très d'accord, c'est bien certe de réflérir en termes d'objets, mais faut pas non plus en abusé. Faire une intance pour obtenir des constantes communes à une classe c'est pas forcément recommandé...

    Citation Envoyé par gifffftane
    Je reproche à l'approche par public final static d'être peu robuste aux modifs, et d'être static.
    Hum... C'est un peu le principe d'une constante d'être "static".

  4. #4
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Citation Envoyé par gifffftane
    Pour moi, la best practice est de ne pas utiliser de public static final Je les remplace toujours par des private static final.
    Heu , Dans le cas d'une classe regroupant des constantes, quel est l'interêt de créer une instance de classe ??
    Je ne pense que ca soit une mauvaise pratique d'utiliser public final static
    au contraire (voir l'exemple plus bas).

    Si il doit y avoir un traitement sur des constantes.. (et encore) au mieux on va créer des méthodes statiques.

    Effectivement, l'idéal est d'utiliser un type enum et si on n'est pas sous la version 5 (min) on peut construire soit même sa classe d'énumération :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    public class CategoryEnum {
     
    		public static final ArrayList listCats = new ArrayList();
    		public static final CategoryEnum CONST1;
    		public static final CategoryEnum CONST2;
     
     
     
    		static
    		{
    			listCats.add(CONST1 = new CategoryEnum("const1","constante 1",1));
    			listCats.add(CONST2 = new CategoryEnum("const2","constante 2",2));
     
     
    		}
     
    		private String name;
    		private String title;
    		private Integer idBD;
     
    		protected CategoryEnum(String pName,String pTitle,Integer pIdDB)
    		{	
    			this.name = pName;
    			this.title = pTitle;
    			this.idBD = pIdDB;
    		}
     
    		public static List getCategories(){
    			return listCats;
    		}
     
    		/**
                     * @return
                     * 
                     * return un objet de type Integer
                     */
    		public Integer getIdBD() {
    			return idBD;
    		}
     
    		/**
                     * @return
                     * 
                     * return un objet de type String
                     */
    		public String getTitle() {
    			return title;
    		}
     
    		/**
                     * @return
                     * 
                     * return un objet de type String
                     */
    		public String getName() {
    			return name;
    		}
     
    	/**
             * Permet de comparer deux categories, si le parametre est null on considere que la comparaison 
             * est fausse.
             */
    	public boolean equals(Object obj) {
    		if(obj ==  null){
    			return false;
    		}
    		return new Integer(this.hashCode()).equals(new Integer(obj.hashCode()));
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#hashCode()
    	 */
    	public int hashCode() {
     
    		return (name + idBD + title).hashCode();
    	}
     
     
    	public static CategoryEnum getCategoryEnumByName(String catName){
     
    		if(catName==null)
    		{
    			throw new NullPointerException("Le nom de la passé en parametre est null" );
    		}
    		for(Iterator i = listCats.iterator();i.hasNext();){
    			CategoryEnum c = (CategoryEnum)i.next();
    			int hc = c.getName().hashCode();
    			if(hc == catName.hashCode())
    			{
    				return c;
    			}
    		}
    		//cas ou la catégorie n'existe pas !
    		return null;
    	}
     
     
    }
    C'est un exemple..

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Ma vision des choses à été très bien résumée par Rom

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Eh bien je vais être extrême, puisque vous m'y poussez. Pour moi, une constante est l'indice d'une erreur, de quelque chose de mal vu, de mal compris. C'est une petite lampe jaune qui s'allume.

    On me parle de l'EXIT_ON_CLOSE. Bien sûr que je l'utilise souvent. Mais j'observe que, lorsque un logiciel prend de l'ampleur, je dois toujours l'effacer des endroits où je l'avais mise au premier abord, pour la remplacer par une variable, ou quelque chose qui gère la fin, voire même quelque chose de complètement différent.

    C'est que le contexte et la gestion du logiciel se précise mieux, tout en prenant de l'ampleur.

    Cela peut être simplement que je teste ma fenêtre ; si je laisse l'EXIT_ON_CLOSE tel que, alors s'en est fini pour les tests suivants...

    Cela peut être aussi que la fenêtre que je croyais toute seule au départ se multiplie, se clone ; si l'une d'elle fait l'exit du programme, évidemment, c'est mal barré pour les autres.

    Et ainsi de suite.

  7. #7
    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
    Par défaut
    Si ce sont des constantes pour paramétrer ton application, une interface est suffisante... De plus ça t'évite le public static final, vu que c'est implicite dans une interface.

    Si c'est pour des énumérations, il faut définir une enum plutôt que des constantes.

    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum Humeur { CONTENT, PAS_CONTENT, MOYEN }

  8. #8
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    En se basant sur ton titre (Difference entre Class Abstraite et interface), la différence, c'est qu'une interface ne définit aucun code d'implémentation. Les méthodes des interfaces sont également toujours publiques.

    Pour définir des constantes, tu peux utiliser les enum à partir de java 5.

  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
    Citation Envoyé par benwit
    Les interfaces sont également toujours publiques.
    Faux!

    Les interfaces peuvent aussi être privées package....


    Ce sont les méthodes qu'elles déclarent qui sont toujours "public abstract"



  10. #10
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Oui, je pensais aux méthodes. Merci de corriger

  11. #11
    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 Pill_S
    Les interfaces peuvent aussi être privées package....
    D'ailleurs elles peuvent aussi être protected ou private... (si si je vous assure )

    a++

  12. #12
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    ça m'a fait le même effet la fois où j'ai fait un new UneInterface() { ... } !

Discussions similaires

  1. [POO] Classes abstraites ou interfaces
    Par Kapha dans le forum Langage
    Réponses: 8
    Dernier message: 31/01/2008, 09h43
  2. [Débutant] classe abstraite ou interface
    Par Chatbour dans le forum Langage
    Réponses: 9
    Dernier message: 29/11/2007, 09h45
  3. Classe abstraite et interface
    Par ender91 dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2007, 11h46
  4. Réponses: 5
    Dernier message: 28/03/2007, 17h28
  5. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02

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