[JAVA] Rubrique 64: Se référer aux objets par leurs interfaces

64. Reportez-vous à l'interface

Il est plus flexible de déclarer le type dans l'interface.

** Tous les arguments, valeurs de retour, variables et champs doivent être déclarés avec le type d'interface, le cas échéant. ** ** La classe d'objet est référencée uniquement dans le constructeur.

Ci-dessous, nous prendrons LinkedHashSet, qui est une classe d'implémentation de l'interface Set, comme exemple.

// Good - uses interface as type
Set<Son> sonSet = new LinkedHashSet<>();

Ce qui précède est un bon exemple.

// Bad - uses class as type!
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

Ce qui précède est un mauvais exemple.

Dans l'exemple déclaré dans l'interface, la classe d'implémentation peut être modifiée fondamentalement sans erreur en changeant simplement comme suit (car seule la méthode déclarée dans l'interface est utilisée).

Set<Son> sonSet = new HashSet<>();

Une chose à garder à l'esprit, cependant, est que le code qui dépend de fonctionnalités qui ne sont pas spécifiées dans l'interface peut avoir pour effet de changer la classe d'implémentation. Par exemple, si vous dépendiez de la stratégie de réorganisation LinkedHashSet, la modification de l'implémentation en HashSet aura un impact.

Lorsqu'il n'y a pas d'interface appropriée

Lorsqu'il n'y a pas d'interface appropriée, il est correct de déclarer par type de classe.

value class Par exemple, considérons une classe de valeur qui représente une valeur telle que String ou BigInteger. Il est peu probable que la classe value ait plusieurs implémentations. De plus, il s'agit généralement d'une classe finale, et il n'y a pas d'interface correspondante. value class est un bon type pour les arguments, les variables, les champs et les valeurs de retour.

Lors de l'utilisation d'un framework basé sur des classes

Vous utilisez un framework basé sur des classes et parfois le type sous-jacent approprié est une classe plutôt qu'une interface. Même dans un tel cas, il vaut mieux hériter d'une classe appropriée (généralement abstraite). OutputStream de java.io correspond à cela.

Il n'y a pas d'interface appropriée, mais une méthode adaptée à la classe d'implémentation est implémentée

Par exemple, PriorityQueue a une méthode de comparaison, mais pas l'interface Queue. Si vous écrivez un programme qui dépend de la méthode de comparaison, reportez-vous à PriorityQueue. Cependant, de tels cas sont rares.

Les trois cas ci-dessus ne sont pas exhaustifs et véhiculent en quelque sorte les scènes référencées dans la classe.

** Si vous ne disposez pas d'une interface appropriée, vous devez vous référer à la classe la plus abstraite qui a la fonctionnalité souhaitée. ** **

Recommended Posts

Rubrique 64: Se référer aux objets par leurs interfaces
Rubrique 65: Préférez les interfaces à la réflexion
Point 41: Utiliser les interfaces de marqueurs pour définir les types