141 votes

Polymorphisme : Pourquoi utiliser « List list = new ArrayList » au lieu de « liste ArrayList = new ArrayList » ?

Double Possible:
Pourquoi l'interface d'une classe Java sont préférées?

Quand dois-je utiliser

List<Object> list = new ArrayList<Object>;

ArrayList hérite List, donc si certaines fonctionnalités en ArrayList ne sont pas en List, alors j'aurai perdu certaines des caractéristiques de la ArrayList, droite? Et le compilateur avis une erreur en essayant d'accéder à ces méthodes?

Merci! :)

246voto

Alex Lockwood Points 31578

La principale raison pour laquelle vous pourriez faire est de découpler le code d'une mise en œuvre spécifique de l'interface. Lorsque vous écrivez votre code comme ceci:

List list = new ArrayList();  

le reste de votre code qui ne sait que les données sont de type List, ce qui est préférable, car il vous permet de basculer entre les différentes implémentations de l' List interface avec la facilité.

Par exemple, disons que vous avez écrit un assez grand 3ème partie de la bibliothèque, et dire que vous avez décidé de mettre en œuvre la base de votre bibliothèque avec un LinkedList. Si votre bibliothèque s'appuie fortement sur l'accès aux éléments de ces listes, finalement, vous verrez que vous avez pris une mauvaise décision de conception; vous vous rendrez compte que vous devriez avoir utilisé un ArrayList (ce qui donne O(1) temps d'accès) au lieu d'un LinkedList (ce qui donne O(n), temps d'accès). En supposant que vous avez été la programmation d'une interface, un tel changement est facile. Il vous suffit de modifier l'instance de List de,

List list = new LinkedList();

pour

List list = new ArrayList();  

et vous savez que cela va fonctionner parce que vous avez écrit votre code pour suivre le contrat fourni par l' List interface.

D'autre part, si vous avait mis en place la base de votre bibliothèque à l'aide d' LinkedList list = new LinkedList(), un tel changement ne serait pas aussi facile, car il n'y a aucune garantie que le reste de votre code ne nécessite pas d'utiliser des méthodes spécifiques à l' LinkedList classe.

Dans l'ensemble, le choix est tout simplement une question de design... mais ce genre de design est très important (surtout lorsque l'on travaille sur de gros projets), il vous permettra de faire de la mise en œuvre des changements spécifiques plus tard, sans casser le code existant.

68voto

tsatiz Points 716

Cela s’appelle la programmation d’interface. Ce sera utile en cas si vous souhaitez déplacer vers certains autre application de liste à l’avenir. Si vous souhaitez que certaines méthodes vous devez programmer la mise en œuvre qui est .

22voto

Brendan Long Points 24372

Ceci est également utile lors de l’exposition d’une interface publique. Si vous avez une méthode comme ceci,

Puis vous décidez de le changer

Toute personne qui faisait `` devront changer leur code. En revanche, si vous le faites,

Vous modifiez la mise en œuvre ne change quoi que ce soit pour les utilisateurs de votre API.

7voto

assylias Points 102015

Cela vous permet d’écrire quelque chose comme :

Plus tard, vous pourriez vouloir changer pour :

sans avoir à changer le reste de la méthode.

Toutefois, si vous souhaitez utiliser un `` par exemple, vous devrez le déclarer comme tel et non comme une liste si vous souhaitez utiliser ses méthodes supplémentaires (addIfAbsent par exemple) :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X