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 :

Déclaration d'un enum


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Par défaut Déclaration d'un enum
    Bonjour à tous.

    Voilà je poste ce petit message parce que je suis actuellement en train d'étudier un bouquin pour passer la SCJP de Sun mais il se trouve qu'en effectuant des examens blancs, je suis tombé sur quelque chose de bizarre que je ne comprend pas.
    Alors je pense n'avoir pas saisi une subtilité parce que c'est assez étrange.

    Le bouquin que j'utilise est bien entendu le plus connu pour passer la Certif:
    http://www.amazon.com/Certified-Prog.../dp/0072253606

    Si vous le possédez rendez-vous à la page 73 sur le paragraphe concernant les enums et où ceci est noté noir sur blanc

    An enum declared outside a class must NOT be marked static, final, abstract, protected or private
    Sa corolaire est donc de dire qu'un enum déclaré à l'extérieur d'une classe doit être public ou "default".

    Maintenant en passant des examens blancs, je suis tombé sur une question me demandant de replacer des bouts de code dans une classe donnée. Au final on obtenait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum X {X1, X2, X3} // 1
    public class AStudyInEnum {
    	public enum Y {Y1, Y2, Y3} // 2
    	public AStudyInEnum() {
    		System.out.println(X.X1+""+Y.Y1);
    	}
    	public static void main(String[] args) {
    		new AStudyInEnum();
    	}
    }
    Et il se trouve que j'ai eu mauvais à la question car j'avais inversé les déclarations des énums (//1 et //2).
    Ne comprenant pas pourquoi j'ai donc testé ma version du code sous Eclipse et effectivement cela ne compile pas. Par contre, si je retire le "public" dans la déclaration de l'enum en dehors de la classe, ça fonctionne alors parfaitement!

    Pourtant suite à la phrase du bouquin il me semblait clair que l'on pouvait utiliser "public" pour déclarer un enum en dehors d'une classe...

    Quelqu'un connait-il la subtilité?
    Merci d'avance!

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par k o D Voir le message
    Bonjour à tous.

    Voilà je poste ce petit message parce que je suis actuellement en train d'étudier un bouquin pour passer la SCJP de Sun mais il se trouve qu'en effectuant des examens blancs, je suis tombé sur quelque chose de bizarre que je ne comprend pas.
    Alors je pense n'avoir pas saisi une subtilité parce que c'est assez étrange.

    Le bouquin que j'utilise est bien entendu le plus connu pour passer la Certif:
    http://www.amazon.com/Certified-Prog.../dp/0072253606

    Si vous le possédez rendez-vous à la page 73 sur le paragraphe concernant les enums et où ceci est noté noir sur blanc



    Sa corolaire est donc de dire qu'un enum déclaré à l'extérieur d'une classe doit être public ou "default".

    Maintenant en passant des examens blancs, je suis tombé sur une question me demandant de replacer des bouts de code dans une classe donnée. Au final on obtenait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum X {X1, X2, X3} // 1
    public class AStudyInEnum {
    	public enum Y {Y1, Y2, Y3} // 2
    	public AStudyInEnum() {
    		System.out.println(X.X1+""+Y.Y1);
    	}
    	public static void main(String[] args) {
    		new AStudyInEnum();
    	}
    }
    Et il se trouve que j'ai eu mauvais à la question car j'avais inversé les déclarations des énums (//1 et //2).
    Ne comprenant pas pourquoi j'ai donc testé ma version du code sous Eclipse et effectivement cela ne compile pas. Par contre, si je retire le "public" dans la déclaration de l'enum en dehors de la classe, ça fonctionne alors parfaitement!

    Pourtant suite à la phrase du bouquin il me semblait clair que l'on pouvait utiliser "public" pour déclarer un enum en dehors d'une classe...

    Quelqu'un connait-il la subtilité?
    Merci d'avance!
    Salut à toi.

    Je ne suis pas totalement sur de ce que j'avance mais il me semble que là on tombe sous le coup de la règle "une seule classe publique par fichier".

    Ainsi, de la même façon que l'on ne peux pas placer 2 classes publiques dans un même fichier en Java, et étant donné que l'Enum, malgré ses particularités, reste une classe à mon sens, cela expliquerait pour moi qu'on ne puisse pas créer une enum public extérieur à une classe dans un même fichier qu'une classe publique.

  3. #3
    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 Deadpool Voir le message
    Je ne suis pas totalement sur de ce que j'avance mais il me semble que là on tombe sous le coup de la règle "une seule classe publique par fichier".
    Oui c'est exactement cela ! Un fichier source Java ne peut contenir qu'un seul et unique type "top-level" public...



    Citation Envoyé par Deadpool Voir le message
    Ainsi, de la même façon que l'on ne peux pas placer 2 classes publiques dans un même fichier en Java, et étant donné que l'Enum, malgré ses particularités, reste une classe à mon sens, cela expliquerait pour moi qu'on ne puisse pas créer une enum public extérieur à une classe dans un même fichier qu'une classe publique.
    On ne peut créer qu'un seul type "top-level" (c'est à dire qui n'est pas déclaré à l'intérieur d'un autre type) par fichier source, et le nom du fichier source doit correspondre au nom du type public


    Citation Envoyé par k o D Voir le message
    An enum declared outside a class must NOT be marked static, final, abstract, protected or private
    Sa corolaire est donc de dire qu'un enum déclaré à l'extérieur d'une classe doit être public ou "default".
    Non cette corolaire est fausse ! Une enum déclaré à l'intérieur d'une autre classe peut très bien être déclaré protected ou private (comme n'importe quel type en fait).


    En général pour tous les types (class, interface, enum et annotation), on doit respecter certaines règles selon les cas :

    En ce qui concerne les règles de visibilités (public, protected, package-only et private), on distinque deux cas :
    • Sur un type "top-level", on ne peut utiliser que les visibilité public et package-only. Private serait complètement inutile (la classe serait innaccessible) et protected se limiterait à la visibilité de package...
      En plus de cela il faut respecter la règle d'une classe public "top-level" par package
    • Par contre on peut utiliser toutes les visibilités pour les types internes (déclaré à l'intérieur d'un autre type donc), qui de toute façon visible au minimum par la classe conteneur.



    Concernant static cela n'a aucun sens pour un type "top-level" quel qu'il soit, et c'est donc refusé par le compilateur.
    Il ne s'applique que sur les types internes :
    • Pour les classes internes, cela permet de détacher le type du conteneur, par défaut une classe interne non-static est lié à une instance de la classe conteneur (pour plus d'info : Quels sont les différents types de classes internes (nested classes) ?).
    • Tous les autres types internes (interface, annotation et enum) sont implicitement static. L'utilisation du mot-clef est donc optionnel mais accepté par le compilateur.


    Le mot-clef abstract est principalement utile pour déclarer une classe abstraite, mais on peut noter ceci :
    • Les interfaces et annotations sont implicitement abstract. L'utilisation du mot-clef est donc optionnel mais accepté par le compilateur.
    • Les enums ne peuvent en aucun cas être déclaré abstract.


    De même pour final qui permet d'interdire d'étendre une classe :
    • Les interfaces et annotations ne peuvent pas être déclaré final. Cela n'aurait aucun sens.
    • Malgré qu'elles ne peuvent pas être redéfinies, les enums ne peuvent être déclarées final. Toutefois le compilateur essayera de définir l'enum comme final lorsque c'est possible.




    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Par défaut
    Mmm c'est possible mais alors ça impliquerai que la seule façon d'avoir un public enum c'est que le nom du fichier soit le nom de l'enum?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public enum X {X1, X2, X3} // 1
    class AStudyInEnum {
    	public enum Y {Y1, Y2, Y3} // 2
    	public AStudyInEnum() {
    		System.out.println(X.X1+""+Y.Y1);
    	}
    	public static void main(String[] args) {
    		new AStudyInEnum();
    	}
    }
    dans X.java alors?

    C'est possible en effet oui...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Par défaut
    Non cette corolaire est fausse ! Une enum déclaré à l'intérieur d'une autre classe peut très bien être déclaré protected ou private (comme n'importe quel type en fait).
    Je ne parle pas des enum internes... j'ai dis
    Sa corolaire est donc de dire qu'un enum déclaré à l'extérieur d'une classe doit être public ou "default".
    Enfin merci pour ton explication, j'espère que je n'oublierai pas ça le jour de l'examen ^^

  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 k o D Voir le message
    Je ne parle pas des enum internes... j'ai dis
    Oups en effet j'ai lu un peu trop vite

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/01/2015, 15h04
  2. enum : "Erreur de syntaxe de déclaration"
    Par Tenebrous dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2012, 14h42
  3. Réponses: 2
    Dernier message: 28/10/2010, 16h38
  4. Déclaration enum avec caractères spéciaux
    Par lvfco dans le forum Langage
    Réponses: 4
    Dernier message: 01/06/2010, 11h31
  5. Des erreurs dans la déclaration d'une enum
    Par moooona dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2008, 04h33

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