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

Collection et Stream Java Discussion :

System.getenv() et interface Map<String, String>


Sujet :

Collection et Stream Java

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par d�faut System.getenv() et interface Map<String, String>
    Bonjour � tous.
    Hier en consultant la javadoc sur la classe system je me suis aper�u que la m�thode static getenv() me renvoyait un objet de type Map<String,String>

    Or premi�re chose qui me surprend: Map dans la javadoc ce n'est pas une classe mais une interface ...

    J'ai donc voulu pousser l'investigation un peu plus loin et j'ai �crit ce petit bout de code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		Map<String,String> menv = System.getenv();
    		System.out.println(menv.size());
    		Iterator varEnv = menv.keySet().iterator();
    		while(varEnv.hasNext()) {
    			String nomVar = (String)varEnv.next();
    			System.out.println("Variable: "+nomVar+" ; Contenu : "+menv.get(nomVar));
    		}
    Je m'attendais � ce qu'on ne puisse pas �crire/utiliser menv.size() puisque Map est cens� �tre une interface.
    Mais apparemment si!
    Ce qui m'�tonne tout de m�me c'est qu'on m'a toujours dit que les interfaces �taient en quelquesorte des squelettes et que les classes sont cens�s impl�menter ces m�thodes squelettes.
    M'aurait on menti ? ;-)
    Il y a certainement un truc qui m'�chappe mais je ne vois pas lequel.
    Si quelqu'un � une explication je suis preneuse.

  2. #2
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Salut,

    C'est toute la diff�rence entre les types et les classes.

    Map est une interface : elle d�finit un certain nombre de m�thodes, sans fournir d'impl�mentation. Ensuite, il y a des classes qui impl�mentent cette interface : soit des classes abstraites, soit des classes concr�tes (celles qui ne sont pas abstraites).

    Par exemple HashMap est une classe qui impl�mente Map. En effet Map, n'a pas de code et ne peut �tre instanci�e. HashMap a tout le code n�cessit� par Map, et peut �tre instanci�e.

    La m�thode System.getenv() renvoit un objet dont la classe concr�te impl�mente Map. On ne sait pas laquelle : il faudrait aller voir le source de cette m�thode pour le savoir. Mais on s'en moque un peu de la classe : ce qui nous int�resse, c'est comment manipuler l'instance : et le fait que getenv() renvoit une instance typ�e par l'interface Map suffit pour faire cette manipulation.

    Voici un petit exemple :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    public static List<String> getList() {
       List<String> list = new ArrayList<>();
       list.add("pim");
       list.add("pam");
       list.add("poum");
       return list;
    }
    Ici on cr�� une instance de ArrayList (classe concr�te), mais on manipule cette instance par la variable list qui est du type List : cette interface est suffisant pour les manipulations qu'on veut faire. Et le code qui appelera la m�thode manipulera �galement l'instance de ArrayList par l'interface.

    L'avantage c'est qu'on peut changer de classe, sans que le code appelant n�cessite d'�tre chang�.

    Si la m�thode avait �t� :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    public static ArrayList<String> getList() {
       ArrayList<String> list = new ArrayList<>();
       list.add("pim");
       list.add("pam");
       list.add("poum");
       return list;
    }
    Et qu'on ait besoin d'utiliser une LinkedList ensuite, il faudra changer ArrayList en LinkedList.

    Et s'il y a du code �crit comme �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ArrayList<String > list = var.getList();
    Il faudra le modifier aussi. S'il y a des milliers d'appels, �a fait du boulot.

    Le deuxi�me int�r�t, et c'est aussi pour cette raison, que getenv() est comme �a : c'est la classe concr�te peut �tre masqu�e (private).

    Dans le cas de getenv(), la classe concr�te est Collections.UnmodifiableMap, une classe interne statique de la classe Collections, que les concepteurs de cette classe n'ont pas voulu exposer. Ainsi, la map retourn�e par getenv est d'une classe qui n'est pas accessible � l'ext�rieur de Collections, et qui, donc, pour pouvoir �tre manipul�e, impl�mente une interface qui elle est public.
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par d�faut
    Oui c'est juste. Mais c'est pas parce qu'AUCUN objet ne pourra �tre instanci� � partir du type Map qu'on pourra pas le r�f�rencer sous ce type

    Donc la r�f�rence c'est Map. La classe r�elle, si tu l'affiche via System.out.println(menv.getClass());, sera probablement une java.util.HashMap ou un truc du genre, bref, une impl�mentation concr�te de l'interface Map.

    A quoi �a sert finalement, de d�clarer un type et d'en utiliser un autre? Bin �a sert � pouvoir changer l'impl�mentation sans rien changer d'autre au code

    Tu trouves que java.util.HashMap est trop lent/bugg�/pas bien? Bah pas de souci, tu changes l'impl�mentation en mettant par exemple la tienne, "com.moi.MaSuperMapRapideDeLaMort", et il n'y a que �a qui change. Le reste du code, qui r�f�rence java.util.Map, est garantit de continuer � fonctionner.

    [EDIT] grilled :/

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par d�faut
    Rebonjour.
    Merci � vous deux pour ces r�ponses claires et pr�cises .
    Je me doutais que System.getenv() renvoyait une classe qui impl�mente l'interface Map.
    C'est bien que vous ayez pu me le confirmer.

    Et pour info
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    Map<String,String> menv = System.getenv();
    System.out.println(menv.getClass().getName());
    me renvoie ceci : java.util.Collections$UnmodifiableMap
    (Comme le sp�cifiait Joel)

    Encore Merci.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Map<String, String> static et accents
    Par zaboug dans le forum Collection et Stream
    R�ponses: 7
    Dernier message: 01/08/2011, 10h11
  2. Recuperation d'un map <string,string> au lieu d'un list
    Par sallemel dans le forum Hibernate
    R�ponses: 2
    Dernier message: 25/02/2011, 00h56
  3. vector<map<string, string> >::iterator ?
    Par scheme dans le forum C++
    R�ponses: 11
    Dernier message: 10/12/2010, 09h32
  4. @CollectionOfElements Map<String, String>
    Par Hammer dans le forum Hibernate
    R�ponses: 1
    Dernier message: 15/04/2010, 20h27
  5. R�ponses: 8
    Dernier message: 07/04/2006, 11h18

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