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 :

Collections: Interface et Objet


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut Collections: Interface et Objet
    Bonjour,

    Je suis entrain de lire de la documentation sur les collection et map.

    J'ai une question concernant les interfaces.

    Quel est l'avantage de faire:
    Collection<String> collection = new ArrayList<String>();

    Plutôt que:
    ArrayList<String> collection = new ArrayList<String>();

    Et surtout quelle est la différence ?

    Je pose cette question parce que j'ai vu:
    List<Produit> produits = new ArrayList<Produit>();

    Pourquoi utiliser List plutôt que ArrayList ?

    Merci beaucoup pour votre temps!

  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Bonjour,

    Le fait de passer par les interfaces permet d'être libre vis à vis de l'inplémentation de la structure de données : en effet supposons qu'après coup tu as décidé d'utiliser une LinkedList au lieu d'une ArrayList, tu n'as qu'une seule ligne à changer c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Produit> produits = new LinkedList<Produit>();
    Tout le reste du code reste inchangé.

    J'espère que c'est clair, dans le cas contraire n'hésite pas à poser des questions

    @+


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Salut,

    Merci pour ta réponse.

    Cependant je ne comprends pas encore très bien.
    Qu'est-ce que ça changerait dans le code si je définissais à l'avance:
    ArrayList<String> = new ArrayList<String>();

    Et que je veuille ensuite changer par une LinkedList. Je change les 2 ArrayList en LinkedList et c'est tout bon.

    Donc je ne vois pas d'avantage.

    Merci pour ton temps

  4. #4
    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,


    Cela permet en effet de faire abstraction de l'implémentation.

    Grosso modo lorsque tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<String> collection;
    Tu utilises une liste d'objet indexé, basé en interne sur l'utilisation d'un tableau d'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Produit> produits;
    Tu utilises une liste d'objet indexé (quel que soit son implémentation).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<Produit> produits;
    Tu utilises une collection d'objet (quel que soit son implémentation).



    Les interfaces décrivent le comportement général des collections. Pour rappel, les principales interfaces de l'API de collections :
    • Collection représente un ensemble d'élément.
    • List représente un ensemble d'élément ordonné indexé.
    • Set représente un ensemble d'élément unique.
    • Map permet d'associer une clef à une valeur.
    • Queue et BlockingQueue (Java 5.0) représentent des queues qui ordonne les éléments (généralement en FIFO ou en LIFO)
    • Deque et BlockingDeque (Java 6) sont des queues permettant l'insertion et la suppression à leurs deux extrémités.


    Ensuite chaque implémentation a ses spécificités propre, dont le choix peut dépendre de besoins préçis.



    Mais dans la plupart des cas tu n'as pas besoin d'utiliser une implémentation en particulier, et l'utilisation d'une interface à la place du type réel te permet une plus grande souplesse. C'est vrai en particulier pour les paramètres et types de retour des méthodes.

    En effet prenons un cas particulier d'une méthode qui affiche tous les éléments d'une ArrayList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public static void printAll (ArrayList<?> arrayList) {
    		for (Object o : arrayList) {
    			System.out.println(o);
    		}
    	}
    Le problème est que tu limites "virtuellement" l'utilisation d'ArrayList alors qu'en utilisant une interface tu permets l'utilisation de la méthode avec n'importe quel type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public static void printAll (Collection<?> c) {
    		for (Object o : c) {
    			System.out.println(o);
    		}
    	}
    Bref tu ne limites plus l'utilisateur de ta méthode à utiliser une seule implémentation, mais tu lui permet d'utiliser n'importe laquelle...




    Autre exemple, où là tu t'imposes une seule implémentation. Imaginons que dans une de tes classes tu ais une méthode du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	private ArrayList<String> data = new ArrayList<String>();
     
    	public ArrayList<String> getData() {
    		return this.data;
    	}
    Maintenant si ta classe évolue et que tu te retrouves dans l'obligation d'utiliser une autre type de liste (par exemple une liste syncronized), tu es obligé de modifier le type de retour de ta méthode getData(), et par la même potentiellement tout les codes qui utilisent ta méthode (bref tu fais une modifications qui casse la compatibilité source et binaire). Ce qui peut se reveler assez génant (en particulier si tu n'as pas la main sur tout le code).

    Alors que si dès le départ tu aurais fait abstraction de l'implémentation de ta liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	private List<String> data = new ArrayList<String>();
     
    	public List<String> getData() {
    		return this.data;
    	}
    Ce changement aurait été totalement transparent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	private List<String> data = Collections.synchronizedList(new ArrayList<String>());
     
    	public List<String> getData() {
    		return this.data;
    	}


    J'espère que c'est clair

    a++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Super!

    Merci pour vos réponses. J'ai enfin compris et je pense que ça va s'affiner au fil du temps!

    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [E-00] Collection dans un objet, est-ce possible ?
    Par Contrec dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/12/2008, 17h35
  2. Réponses: 0
    Dernier message: 11/11/2008, 19h52
  3. [DAO] Interface entre objets métier et BDD
    Par mister3957 dans le forum Autres
    Réponses: 5
    Dernier message: 21/04/2008, 09h20
  4. html:options - collection dans un objet en session-
    Par gazier20 dans le forum Struts 1
    Réponses: 3
    Dernier message: 13/06/2007, 10h12
  5. [Collections]Tableaux d'objets uniques.
    Par Invité dans le forum Collection et Stream
    Réponses: 30
    Dernier message: 22/03/2006, 13h20

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