web-dev-qa-db-fra.com

Java Lignes directrices d'utilisation de l'interface - sont des getters et des setters dans une interface mal?

Que pensent les gens des meilleures directives à utiliser dans une interface? Que devriez-vous et ne devrait pas aller dans une interface?

J'ai entendu dire que des gens disent que, en règle générale, une interface ne doit définir que le comportement et non l'état. Cela signifie-t-il qu'une interface ne doit pas contenir de getters et de setters?

Mon avis: Peut-être pas pour les configurants, mais parfois, je pense que les getters sont valables pour être placés dans une interface. Il s'agit simplement de faire respecter les classes de mise en œuvre pour mettre en œuvre ces getters et pour indiquer que les clients sont capables d'appeler ces getters à vérifier quelque chose, par exemple.

35
His

Je pense qu'il existe deux types d'interfaces déclarées en général:

  1. a Description du service. Cela pourrait être quelque chose comme CalculationService. Je ne pense pas que les méthodes getX devraient être dans ce type d'interface, et certainement pas setX. Ils impliquent assez clairement les détails de la mise en œuvre, ce qui n'est pas le travail de ce type d'interface.
  2. a Modèle de données - Existe uniquement pour résumer la mise en œuvre d'objets de données dans le système. Celles-ci pourraient être utilisées pour faciliter les tests ou simplement parce que certaines personnes aussi anciennes que moi se souviennent des jours où (par exemple) à l'aide d'un cadre de persistance vous attaquait de disposer de superclasses particulières (c'est-à-dire que vous choisiriez d'implémenter une interface au cas où vous avez changé. votre couche de persistance). Je pense qu'avoir des méthodes javabes dans ce type d'interface est entièrement raisonnable.

Remarque: les classes de collections sont probablement adaptées à TYPE # 2

13
oxbow_lakes

Il n'y a rien de mal inhéremment à des getters/setters. Toutefois:

  1. J'ai tendance à rendre mes objets immuables (en premier lieu) par rapport aux champs qu'ils contiennent. Pourquoi ? J'instire la plupart des choses pendant la phase de construction. Si je veux changer quelque chose plus tard, je détends ces restrictions. Donc, mes interfaces auront tendance à contenir des getters, mais pas de setters (il existe d'autres avantages - en particulier le filetage).
  2. Je veux que mes objets fassent les choses pour moi , pas l'inverse. Donc, lorsque l'un de mes objets acquiert un certain nombre de getters, je commence à demander si cet objet devrait avoir plus de fonctionnalités, plutôt que d'exposer toutes ses données pour quelque chose d'autre pour travailler. Voir Cette réponse Pour plus de détails.

Ce sont toutes des directives, note.

10
Brian Agnew

Je ne pense pas qu'un haricot devrait avoir une interface sur le dessus, en général. Une JavaBean est une interface dans la signification la plus générale. Une interface spécifie le contrat externe de quelque chose de plus complexe. Le contrat externe de Javabean et sa représentation interne sont identiques.

Je ne dirais pas que vous ne devriez pas avoir getters dans une interface, cependant. Il est parfaitement logique d'avoir une interface lecturablehathingie mise en œuvre par Daathingiebean.

4
Kevin Peterson

J'ai entendu dire que des gens disent que, en règle générale, une interface ne doit définir que le comportement et non l'état. Cela signifie-t-il qu'une interface ne doit pas contenir de getters et de setters?

Pour commencer, au moins avec Java et excluant des déclarations d'exception, vous ne pouvez pas définir le comportement complet sans état. En Java, les interfaces ne définissent pas le comportement. Ils ne peuvent pas. Ce qu'ils définissent sont des types; promesses d'implémenter un ensemble de signatures de fonctionnalités éventuellement avec des exceptions de WRT post-conditions. Mais c'est tout. Le comportement et l'état sont définis par des classes implémentant ces interfaces.

Deuxièmement, si les getters et les setters sont définis dans une interface, ils ne définissent pas vraiment comportement complet (d'autres que l'on est à lire et que l'on est pour écrire WRT une propriété.) Vous pouvez avoir un comportement complexe derrière les setters et les getters, mais ils peuvent seulement être mis en œuvre dans les classes actuelles. Il n'y a rien dans le Java langue qui peut nous permettre de définir librement comportement dans des interfaces, à l'exception des cas les plus restrictifs.

avec cela en considération, il n'y a rien de mal - syntaxiquement et sémantiquement - avec des configurateurs et des getters dans des interfaces.

Si votre demande est bien modélisée et que le problème nécessite une interface définissant des setters et des getters, pourquoi pas. Par exemple, jetez un coup d'œil à l'interface servleResponse.

Maintenant, si nous examinons les getters and Setters du point de vue des classes de mise en œuvre conformes aux spécifications JavaBeans, vous n'avez pas besoin de définir des interfaces pour eux.

Mais si vous avez des choses qui nécessitent des setters et des getters, comme un haricot, et qui est également nécessaire pour être branché au type de compilée (pas au moment de l'exécution comme une puissance de haricot), et pour lesquelles plusieurs implémentations pourraient exister, alors ouais Cela ferait appel à une interface définissant des getters et des setters.

J'espère que ça aide.

2
luis.espinal

Cela touche que l'ensemble des getter/Setters est un sujet diabolique qui est abordé plusieurs fois sur ce site et ailleurs.

J'ai tendance à ne pas avoir d'accesseurs dans l'interface, mais d'ajouter des collaborateurs utilisant des arguments du constructeur vers la mise en œuvre.

1
Paul McKenzie

Le fait que la mise en œuvre directe de quelque chose soit comme un getter ne devrait pas l'empêcher d'être dans une interface si elle doit être.

1
soru

J'ai utilisé ce type d'interfaces, par exemple, nous avons eu des cours avec des champs commencés, enddate. Ces champs étaient dans de nombreuses classes et j'avais un cas d'utilisation, j'ai besoin d'obtenir ces dates pour différents objets, alors j'ai extrait l'interface et était très heureux :)

0
IAdapter

Pour la lecture ultérieure: Confessions de conception d'API pratiques d'A Java Framework Architect (Jaroslav Tulach, 2008, Apress).

0
akarnokd