39 votes

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

PMD voudrais signaler une violation pour:

ArrayList<Object> list = new ArrayList<Object>();

La violation a été "Éviter à l'aide de la mise en œuvre des types comme "ArrayList", utiliser l'interface à la place".

La ligne suivante en vue de corriger la violation:

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

Pourquoi ce dernier avec l' List être utilisé à la place de ArrayList?

51voto

kolrie Points 3496

L'utilisation d'interfaces plus de types de béton est la clé pour une bonne encapsulation et pour le couplage de votre code.

C'est même une bonne idée de suivre cette pratique lors de l'écriture de votre propre Api. Si vous le faites, vous allez trouver plus tard que c'est plus facile d'ajouter des tests unitaires pour votre code (en utilisant les Moqueries des techniques), et de modifier l'implémentation sous-jacente si nécessaire dans le futur.

Voici un bon article sur le sujet.

Espérons que cela aide!

24voto

AdamC Points 5828

C'est préférable parce que vous dissociez votre code à partir de la mise en œuvre de la liste. À l'aide de l'interface vous permet de changer facilement la mise en œuvre, ArrayList dans ce cas, à une autre liste de mise en œuvre, sans changer le reste du code, tant qu'il utilise uniquement des méthodes définies dans la Liste.

9voto

Owen Points 1030

En général je suis d'accord que le découplage de l'interface de l'application est une bonne chose et permet de rendre votre code plus facile à maintenir.

Il existe, toutefois, des exceptions que vous devez prendre en compte. Accès aux objets par l'intermédiaire d'interfaces ajoute une couche supplémentaire d'indirection qui permet de rendre votre code plus lent.

Pour d'intérêt que j'ai mené une expérience qui a généré de dix milliards séquentielle accède à un 1 m de longueur ArrayList. Sur mon 2.4 Ghz MacBook, l'accès à la liste de tableaux par le biais d'une Liste d'interface pris 2.10 secondes en moyenne, lors de la déclaration de type ArrayList il a fallu en moyenne de 1,67 secondes.

Si vous travaillez avec de grandes listes, profondément à l'intérieur d'une boucle interne ou souvent appelé la fonction, alors c'est quelque chose à considérer.

4voto

SCdF Points 11397

ArrayList et LinkedList sont deux implémentations d'une Liste, qui est une collection ordonnée d'éléments. Logique-sage, il n'a pas d'importance si vous utilisez une liste de tableaux ou d'une LinkedList, de sorte que vous ne devrait pas limiter le type de l'être.

Cela contraste avec dire, de la Collecte et de la Liste, qui sont des choses différentes (Liste implique le tri, la Collecte n'a pas).

1voto

MetroidFan2002 Points 11413

Les propriétés de vos classes/interfaces doivent être exposés par l'intermédiaire d'interfaces, car il donne à votre classes d'un contrat de comportement à utiliser, indépendamment de la mise en œuvre.

Cependant...

En local, les déclarations de variables, il n'a guère de sens pour ce faire:

public void someMethod() {
List theList = new ArrayList();
//do stuff with the list
}

Si ses une variable locale, il suffit d'utiliser le type. Il est toujours implicitement upcastable à son interface appropriée, et vos méthodes devraient accepter les types d'interface pour ses arguments, mais pour les variables locales, il est tout à fait logique d'utiliser la mise en oeuvre type de conteneur, juste au cas où vous avez besoin de la mise en œuvre de fonctionnalités spécifiques.

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: