IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

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

Le , par naf87

0PARTAGES

3  0 
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/

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 11/12/2012 à 16:48
Citation Envoyé par naf87 Voir le message
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
1  0 
Avatar de professeur shadoko
Membre chevronné https://www.developpez.com
Le 14/12/2012 à 9:27
Citation Envoyé par naf87 Voir le message

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!)
1  0 
Avatar de nicroman
Expert éminent https://www.developpez.com
Le 19/12/2012 à 21:24
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...
1  0 
Avatar de Khaled.Noordin
Membre confirmé https://www.developpez.com
Le 05/12/2012 à 12:06
Salut
Merci pour cet article
0  0 
Avatar de naf87
Membre éclairé https://www.developpez.com
Le 05/12/2012 à 19:20
C'est moi qui te remercie pour tes encouragements
0  0 
Avatar de tralloc
Membre averti https://www.developpez.com
Le 06/12/2012 à 12:01
tu as oublié qu'on pouvait faire ça avec des enum, ça me semble important :
Code : Sélectionner tout
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
0  0 
Avatar de naf87
Membre éclairé https://www.developpez.com
Le 06/12/2012 à 13:14
Merci.
0  0 
Avatar de Deadpool
Membre chevronné https://www.developpez.com
Le 06/12/2012 à 13:50

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.
0  0 
Avatar de naf87
Membre éclairé https://www.developpez.com
Le 11/12/2012 à 10:51
Merci de la remarque
0  0 
Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 11/12/2012 à 11:53
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 : Sélectionner tout
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 : Sélectionner tout
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 : Sélectionner tout
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
0  0