Developpez.com - Rubrique Java

Le Club des Développeurs et IT Pro

Préparation à la certification programmeur Java 6, déclaration et contrôle d'accès,

Par Fabrice Ndjobo

Le 2012-11-03 11:41:08, par naf87, Membre éclairé
Bonjour à tous

Je viens par le présent message vous annoncer la publication de l'article
Déclaration et contrôle d'accès. Il a pour but de présenter de façon concise les notions fondamentales du langage Java (les énumérations, les classes et les interfaces) et s'inscrit dans la suite Le Mémo du certifié Java 6.

A terme, l'ensemble des articles de cette suite devra permettre à tout développeur Java d'avoir sensiblement le même niveau de connaissance qu'un titulaire d'une certification Java SE 6.

Je vous invite donc non seulement à prendre connaissance du contenu de cet article, mais aussi à laisser vos remarques sur la présente discussion afin de l'améliorer.

Je vous souhaite une bonne lecture.

Voici ma page personnelle developpez :
http://armel-ndjobo.developpez.com/
  Discussion forum
25 commentaires
  • tchize_
    Expert éminent sénior
    Envoyé par naf87
    Une classe de type enum est implicitement final à moins qu'une des constantes ne contienne un corps de classe, c'est pourquoi elle ne peut pas être explicitement définie comme abstract.
    J'utiliserais les termes de la JLS moi

    Une classe de type enum est implicitement final à moins qu'une des constantes ne contienne un corps de classe. C'est une erreur de compilation d'utiliser le modifier "abstract" ou "final" pour la déclaration d'un enum
  • professeur shadoko
    Membre chevronné
    Envoyé par naf87

    Je pense qu'il est préférable de dire que cette affirmation n'est pas complète.
    une histoire rigolote à ce sujet: étant intervenu à une époque sur la version française de la certification Java j'avais fait remarquer que l'assertion "accessible depuis les sous-classes" n'était pas vraie puisqu'on pouvait exhiber des cas où ce n'était pas vrai.... réponse des américains: "oui mais c'est vrai dans la majorité des cas" Comme quoi la compréhension de la logique n'est pas la même selon les cultures (et les questions à choix multiples ne sont pas aussi indiscutables qu'on le dit: j'avais plusieurs exemples de ce genre de questionnaires où le seul fait d'être Européen vous faisait donner une "mauvaise" réponse!)
  • nicroman
    Expert éminent
    Au passage, sur le chapitre III, il serait peut-être bien de rajouter les règles de nommage en Java...

    http://www.oracle.com/technetwork/ja...35099.html#367

    on voit de plus en plus de gens utiliser "MaVariable" ou "MaFonction" dans une classe "classeDeTruc"...

    Et d'exposer le fait qu'utiliser des caractères non-ascii, même si cela est permis, a un risque... d'autant que les fichiers .java sont considéré par défaut en CP1252 (ISO-8859-1), donc considérer que tous les caractères unicode sont autorisés.... cela dépend des options de compilations.

    Dans notre boite la règle est de n'utiliser que les caractères ASCII, et, dans les ressources nécessitant des traductions, utiliser la notation \u00A9 pour les caractères unicode...
  • Khaled.Noordin
    Membre confirmé
    Salut
    Merci pour cet article
  • naf87
    Membre éclairé
    C'est moi qui te remercie pour tes encouragements
  • tralloc
    Membre averti
    tu as oublié qu'on pouvait faire ça avec des enum, ça me semble important :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public enum Machin {
    	Mars("planete",12),scrunch("asteroide",1.25f);
    	private final float diametre;
    	private final String type;
    	private Machin(String type,float diametre){
    		this.diametre=diametre;
    		this.type=type;
    	}
    }
    sinon c'est bien
  • naf87
    Membre éclairé
    Merci.
  • Deadpool
    Membre chevronné

    On crée les constantes en Java en faisant précéder les variables des mots clés final et static.
    Moi perso j'aurais approfondi cette assertion car dit comme ça, ce n'est pas forcément vrai.

    En effet, par un objet non immuable, les modificateurs static et final n'empêche pas de le modifier via ses méthodes d'altération.

    De plus en Java une constante est quelque chose de bien particulier comme expliqué dans la FAQ.
  • naf87
    Membre éclairé
    Merci de la remarque
  • tchize_
    Expert éminent sénior
    On va encore dire que je suis pédant mais.... je ne suis pas d'accord:

    Une classe de type enum est implicitement final, c'est pourquoi elle ne peut pas être définie comme abstract.
    C'est faux. Une enum peux être abstract, mais c'est implicite, on ne peux pas l'expliciter. Une enum peut ne pas être final.
    Les règles sont ici: http://docs.oracle.com/javase/specs/...8.html#jls-8.9


    Les types Enum ne doivent pas êter déclarés abstrait, le faire entraient une erreur de compilation.
    Une enum est implicitement final SAUF si au moins une des constantes contient un corps de classe
    autrement dit, cette enum n'est pas final:
    Code :
    1
    2
    3
    4
    5
    public enum SomeEnum {
        
        UN,
        DEUX{};
    }
    Du coup, ceci est faux aussi
    D'après la première règle, on ne peut pas étendre les classes de type enum.
    On peux créer un type anonyme qui étends l'enum, c'est exactement ce que j'ai fais dans le code précédent.

    D'ailleurs, tout ça, tu le fais dans ce point-ci ou tu montre une enum non final et abstraite avec des sous classes anonymes

    Il est possible de déclarer une méthode abstraite dans une classe de type enum, dans ce cas, chaque énumération devrait fournir une implémentation de la méthode sinon une erreur va se produire à la compilation.

    Petit code de démo:

    Code :
    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
    public enum MyEnum {
        
        UN{public void test(){System.out.println("1");}},
        DEUX{public void test(){System.out.println("deux");}};
        public abstract void test();
    }
    
    public enum MyLastEnum {
        
        UN{public void test(){System.out.println("1");}},
        DEUX{public void test(){System.out.println("deux");}};
        public void test(){System.out.println("default");};
    }
    public enum MyOtherEnum {
        
        UN,
        DEUX;
    }
    
    public static void main(String[] args) {
            for (MyEnum e : MyEnum.values()){
                System.out.printf("Class is %s and parent is %s and super parent is %s\n",
                        e.getClass().getName(),
                        e.getClass().getSuperclass().getName(),
                        e.getClass().getSuperclass().getSuperclass().getName());
            }
            System.out.println("MyEnum modifiers: "+Modifier.toString(MyEnum.class.getModifiers()));
            for (MyOtherEnum e : MyOtherEnum.values()){
                System.out.printf("Class is %s and parent is %s and super parent is %s\n",
                        e.getClass().getName(),
                        e.getClass().getSuperclass().getName(),
                        e.getClass().getSuperclass().getSuperclass().getName());
            }
            System.out.println("MyOtherEnum modifiers:  "+Modifier.toString(MyOtherEnum.class.getModifiers()));
            for (MyLastEnum e : MyLastEnum.values()){
                System.out.printf("Class is %s and parent is %s and super parent is %s\n",
                        e.getClass().getName(),
                        e.getClass().getSuperclass().getName(),
                        e.getClass().getSuperclass().getSuperclass().getName());
            }
            System.out.println("MyLastEnum modifiers:  "+Modifier.toString(MyLastEnum.class.getModifiers()));
        }
    Et sa sortie

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class is testenums.MyEnum$1 and parent is testenums.MyEnum and super parent is java.lang.Enum
    Class is testenums.MyEnum$2 and parent is testenums.MyEnum and super parent is java.lang.Enum
    MyEnum modifiers: public abstract
    Class is testenums.MyOtherEnum and parent is java.lang.Enum and super parent is java.lang.Object
    Class is testenums.MyOtherEnum and parent is java.lang.Enum and super parent is java.lang.Object
    MyOtherEnum modifiers:  public final
    Class is testenums.MyLastEnum$1 and parent is testenums.MyLastEnum and super parent is java.lang.Enum
    Class is testenums.MyLastEnum$2 and parent is testenums.MyLastEnum and super parent is java.lang.Enum
    MyLastEnum modifiers:  public