Il semble qu'il y ait beaucoup de confusion dans les réponses.
Le langage Java exige que chaque méthode d'une interface soit implémentée par toutes les implémentations de cette interface. Période. Il n'y a pas d'exception à cette règle. Dire que "les collections sont une exception" suggère une compréhension très floue de ce qui se passe réellement ici.
Il est important de comprendre qu'il y a en quelque sorte deux niveaux de conformité à une interface :
-
Ce que le langage Java peut vérifier. Cela se résume à peu près à la question suivante : existe-t-il une algunos pour chacune des méthodes ?
-
Respecter le contrat. En d'autres termes, l'implémentation fait-elle ce que la documentation de l'interface indique qu'elle doit faire ?
Les interfaces bien écrites comprennent une documentation expliquant exactement ce que l'on attend des implémentations. Votre compilateur ne peut pas vérifier cela pour vous. Vous devez lire la documentation et faire ce qu'elle dit. Si vous ne faites pas ce que dit le contrat, vous aurez une implémentation de l'interface dans la mesure où l'interface compilateur est concerné, mais il s'agira d'une mise en œuvre défectueuse/invalide.
Lors de la conception de l'API Collections, Joshua Bloch a décidé qu'au lieu d'avoir des interfaces très fines pour distinguer les différentes variantes des collections (par exemple : lisible, inscriptible, à accès aléatoire, etc.), il n'aurait qu'un ensemble d'interfaces très grossières, principalement Collection
, List
, Set
y Map
et de documenter certaines opérations comme étant "optionnelles". Il s'agit d'éviter l'explosion combinatoire qui résulterait d'interfaces à grain fin. De la FAQ sur la conception de l'API des collections Java :
Pour illustrer le problème dans les moindres détails, su notion de modifiabilité à la hiérarchie. Vous avez besoin de quatre nouveaux interfaces : ModifiableCollection, ModifiableSet, ModifiableList et ModifiableMap. Ce qui était auparavant une simple hiérarchie est maintenant une hétéroarchie désordonnée. Vous avez également besoin d'une nouvelle interface Iterator à utiliser avec les collections non modifiables, qui ne contient pas l'opération de suppression. Pouvez-vous maintenant supprimer l'exception UnsupportedOperationException ? Malheureusement malheureusement pas.
Prenons l'exemple des tableaux. Ils implémentent la plupart des opérations de la liste, mais pas les opérations suivantes supprimer et ajouter. Il s'agit de listes de taille fixe. Si vous voulez capturer cette notion dans la hiérarchie, vous devez ajouter deux nouvelles interfaces : VariableSizeList et VariableSizeMap. Il n'est pas nécessaire d'ajouter VariableSizeCollection et VariableSizeSet, car elles seraient identiques à ModifiableCollection et ModifiableSet. mais vous pouvez choisir de les ajouter quand même par souci de cohérence. Vous avez également besoin d'une nouvelle de ListIterator qui ne supporte pas les opérations add et remove pour aller de pair avec la liste non modifiable. Nous en sommes maintenant à dix ou douze interfaces, plus deux nouvelles interfaces Iterator, au lieu de nos quatre quatre interfaces initiales. Avons-nous terminé ? Non.
Tenez compte des journaux (tels que les journaux d'erreurs, les journaux d'audit et les journaux de pour les objets de données récupérables). Il s'agit de séquences naturelles de type "append-only", qui prennent en charge toutes les opérations de liste (remplacement). Ils nécessitent une nouvelle interface de base et un nouvel itérateur.
Qu'en est-il des collections immuables, par opposition aux (c'est-à-dire les collections qui ne peuvent pas être modifiées par le client ET qui ne changeront jamais pour une période donnée). pour aucune autre raison). [ ] distinction la plus importante, car elle permet à plusieurs threads d'accéder à une collection. d'accéder à une collection simultanément sans avoir besoin de synchronisation. L'ajout de ce support à la hiérarchie des types nécessite quatre autres interfaces.
Nous en sommes maintenant à une vingtaine d'interfaces et à cinq i presque certain qu'il y a encore des collections qui apparaissent dans la pratique qui ne s'intègrent pas proprement dans l'une ou l'autre des interfaces. Par exemple, la collection renvoyées par Map sont des collections naturelles de type "delete-only". Il existe également des collections qui rejettent certains éléments sur la base de leur valeur. sur la base de leur valeur, de sorte que nous n'avons toujours pas supprimé les exceptions d'exécution. d'exécution.
En fin de compte, nous avons estimé qu'il s'agissait d'une bonne ingénierie. de contourner l'ensemble de la question en fournissant un très petit ensemble de d'interfaces de base pouvant lever une exception au moment de l'exécution.
Lorsque les méthodes de l'API Collections sont documentées comme étant des "opérations optionnelles", cela ne signifie pas que vous pouvez simplement laisser l'implémentation de la méthode dans l'implémentation, ni que vous pouvez utiliser un corps de méthode vide (d'une part, beaucoup d'entre elles doivent renvoyer un résultat). Cela signifie plutôt qu'un choix d'implémentation valide (qui reste conforme au contrat) est de lancer une erreur de type UnsupportedOperationException
.
Il convient de noter que, dans la mesure où UnsupportedOperationException
est un RuntimeException
vous pouvez la lancer à partir de n'importe quelle implémentation de méthode, pour autant que le compilateur soit concerné. Par exemple, vous pouvez le lancer à partir d'une implémentation de Collection.size()
. Toutefois, une telle mise en œuvre constituerait une violation du contrat, car la documentation relative aux Collection.size()
ne dit pas que cela est autorisé.
A part : L'approche utilisée par l'API Collections de Java est quelque peu controversée (probablement moins aujourd'hui que lorsqu'elle a été introduite pour la première fois, cependant). Dans un monde parfait, les interfaces pas ont des opérations optionnelles, et des interfaces à grain fin seraient utilisées à la place. Le problème est que Java ne prend en charge ni les types structurels déduits ni les types d'intersection, et c'est la raison pour laquelle tenter de faire les choses de la "bonne manière" finit par devenir extrêmement lourd dans le cas des collections.
0 votes
À quelles méthodes faites-vous référence ? Je ne les trouve ni dans la JavaDoc ni dans le code source.
0 votes
@dcpomero : docs.oracle.com/javase/tutorial/collections/interfaces/
0 votes
Duplication possible de Que signifie "opération optionnelle" dans la Javadoc de l'exemple Set#add(E) ?