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 :

private nested enum


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Par défaut private nested enum
    Bonjour,
    désolé pour ce titre en anglais mais je préparela SCJP et mes sources sont en anglais donc je connais pas les termes français
    J'ai une question que je vais illustrer par un bout de code :
    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
     
    class MyClass{
    	private enum Testenum{
    		one(1),two(2),three(3),four(4);
    		private int theint;
    		Testenum(int s)
    		{
    			theint=s;
    		}
    	}
    	public Testenum getAnEnum() {
    		return Testenum.three;
    	}
     
    }
    public class PrivateNestedTests implements Test {
     
    	public void run() {
    		System.out.println(new MyClass().getAnEnum());
    	}
     
    }
    Comme vous pouvez le constatez, on a une class qui déclare un enum private. Ce type enum est utilisé comme type de retour d'une méthode publique.
    Du coup je ne vois pas comment dans une autre classe on pourrait utilisé cette méthode étant donné que le type de retour est inaccesible.
    Le code ci dessus marche parfaitement mais comment peut-on stocker au mieux le résultat (le stocker dans un Object c'est un peu crado).
    Je trouve quand même très étrange que le compilateur autorise comme type de retour d'une méthode un type plus restrictif au niveau des accesseur que la méthode elle même! Qu'en pensez-vous?
    Sachant d'ailleurs que la j'utilise un enum, mais le problème est le même pour les inner class.

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu peux le déclarer en Enum, ce qui permet d'accéder à quelques méthodes

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class PrivateNestedTests implements Test {
     
    	public void run() {
    		MyClass classInstance = new MyClass();
    		Enum en = classInstance .getAnEnum();
    		System.out.println(en.ordinal());
    		System.out.println(en.getDeclaringClass());
    	}
    }
    Quant à l'utilité de déclarer en type de retour le type précis de l'enum, même si elle est inaccessible, c'est toujours mieux D'une part parce que tu peux utiliser la fonction en interne dans ta classe (c'est à ça que sert une enum private en général ^^), d'autre part parce que si ta classe est bien nommée on pourra toujours l'utiliser en tant qu'Enum "générique".

  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 Rei Ichido Voir le message
    Quant à l'utilité de déclarer en type de retour le type précis de l'enum, même si elle est inaccessible, c'est toujours mieux
    Heu... Je ne vois pas trop l'intérêt au contraire !

    • Si l'objet est utilisable uniquement en interne il n'y a aucune raison de fournir une méthode public retournant l'objet.
    • Si l'objet est exportable il n'y a aucune raison de rendre sa classe inaccessible.



    a++

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    La méthode est potentiellement utilisable en interne ET en externe. Alors certes on peut faire deux méthodes ... C'est peut-être plus propre d'un point de vue interface ; mais moins pratique si on doit dupliquer du code !

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Le compilateur autorise cela parce qu'il ne connaît pas le code, enfin... complètement. Typiquement, l'enum pourrait étendre une interface A, et la méthode getAnEnum pourrait faire un override d'un "public A getAnEnum();" Toi, tu sais que ce n'est pas le cas, mais le compilateur n'est pas assez poussé.

    Donc oui, tu peux exposer les types internes en renvoyant un objet de leur type, mais tu ne peux les stocker tel que définis : dois les stocker dans un type parent (tel qu'Enum<?> ou Object dans ce cas-ci).

    Le gros avantage de pouvoir exposer ces types internes est par exemple le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MaClasse {
      private enum MonEnum implements MonInterfaceA, MonInterfaceB { ONE }
      public MonEnum getEnum () { return MonEnum.ONE; }
    }
    public interface MonInterfaceA {} // N'étend pas B
    public interface MonInterfaceB {} // N'étend pas A
     
    [...]
     
    public static void main (String... args) {
      MonInterfaceA a = new MaClasse().getEnum();
      MonInterfaceB b = new MaClasse().getEnum();
    }
    Je ne vois pas d'autre cas intéressant.

  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 Rei Ichido Voir le message
    La méthode est potentiellement utilisable en interne ET en externe. Alors certes on peut faire deux méthodes ... C'est peut-être plus propre d'un point de vue interface ; mais moins pratique si on doit dupliquer du code !
    Quel est l'intérêt de manipuler un objet dont on ignore tout ?
    Si l'enum implémente une interface il est nettement plus propre de la renvoyer correctement typé !

    Bref je ne vois vraiment pas l'intérêt de faire cela, si ce n'est d'embrouiller inutilement le développeur qui utilisera la classe...

    a++

Discussions similaires

  1. Private - Protected
    Par Argonz dans le forum C++
    Réponses: 11
    Dernier message: 06/08/2004, 16h21
  2. [STRUTS] Options tag must be nested in a Select tag
    Par meufeu dans le forum Struts 1
    Réponses: 2
    Dernier message: 26/05/2004, 10h21
  3. enum??
    Par $grm$ dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 23/04/2004, 16h34
  4. [STRUTS][NESTED] et OptionCollection
    Par hamed dans le forum Struts 1
    Réponses: 15
    Dernier message: 03/02/2004, 12h27
  5. [TABLE][ENUM] u champs à choix multiple ?
    Par narmataru dans le forum SQL
    Réponses: 2
    Dernier message: 04/11/2003, 10h25

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