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ériteList
, donc si certaines fonctionnalités enArrayList
ne sont pas enList
, alors j'aurai perdu certaines des caractéristiques de laArrayList
, droite? Et le compilateur avis une erreur en essayant d'accéder à ces méthodes?Merci! :)
Réponses
Trop de publicités?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.
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.
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) :