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/
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/
-
tchize_Expert éminent séniorJ'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 enumle 11/12/2012 à 16:48 -
professeur shadokoMembre chevronné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!) le 14/12/2012 à 9:27 -
nicromanExpert éminentAu 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...le 19/12/2012 à 21:24 -
Khaled.NoordinMembre confirméSalut
Merci pour cet articlele 05/12/2012 à 12:06 -
naf87Membre éclairéC'est moi qui te remercie pour tes encouragementsle 05/12/2012 à 19:20
-
trallocMembre avertitu as oublié qu'on pouvait faire ça avec des enum, ça me semble important :
Code : 1
2
3
4
5
6
7
8
9
10public 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; } }
le 06/12/2012 à 12:01 -
naf87Membre éclairéMerci.le 06/12/2012 à 13:14
-
DeadpoolMembre chevronné
On crée les constantes en Java en faisant précéder les variables des mots clés final et static.
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.le 06/12/2012 à 13:50 -
naf87Membre éclairéMerci de la remarquele 11/12/2012 à 10:51
-
tchize_Expert éminent séniorOn 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.
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
Code : 1
2
3
4
5public enum SomeEnum { UN, DEUX{}; }
D'après la première règle, on ne peut pas étendre les classes de type enum.
D'ailleurs, tout ça, tu le fais dans ce point-ci ou tu montre une enum non final et abstraite avec des sous classes anonymesIl 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
42public 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())); }
Code : 1
2
3
4
5
6
7
8
9Class 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
le 11/12/2012 à 11:53