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.
Je pense qu'il existe deux types d'interfaces déclarées en général:
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.Remarque: les classes de collections sont probablement adaptées à TYPE # 2
Il n'y a rien de mal inhéremment à des getters/setters. Toutefois:
Ce sont toutes des directives, note.
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.
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.
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.
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.
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 :)
Pour la lecture ultérieure: Confessions de conception d'API pratiques d'A Java Framework Architect (Jaroslav Tulach, 2008, Apress).