Les champs dans les interfaces
J'ai une question de base en Java, mais c'est une question générale à la programmation orientée objet. Pourquoi ne interfaces permettent de champs pour être ensemble? N'est-ce pas contraire à ce que l'interface est censé faire?
La façon dont j'ai donné du sens, une interface est en anglais serait un adjectif. Donc, si une classe implémente l'interface Runnable et Serializable, je suis en garantissant à l'utilisateur que ma classe de satisfaire les conditions pour être Exécutable et Seriablizable. Cependant, cela signifierait que les interfaces sont des "apatrides", mais ils sont autorisés à avoir des champs en Java...
Suis-je raté quelque chose?
Vous devez vous connecter pour publier un commentaire.
Tous les champs dans l'interface sont
public static final
, c'est à dire qu'ils sont des constantes.Il est généralement recommandé d'éviter de telles interfaces, mais parfois, vous pouvez trouver une interface qui a pas de méthodes et est utilisé uniquement pour contenir la liste de valeurs constantes.
Tout d'abord, il y a différence entre paradigme de la programmation orientée objet et mise en œuvre de la programmation orientée objet en Java, de sorte que les mêmes mots peuvent signifier un peu différente des choses.
En programmation orientée objet, le paradigme de l'interface est ce que que vous pouvez faire avec l'objet (ou ce que objet peut faire pour vous). Tout objet peut avoir plusieurs interfaces et donc de jouer des rôles différents. Par exemple, quelqu'un peut travailler en tant que programmeur et être en mesure de créer des programmes, mais en même temps, il peut être un mari et un père et d'être ainsi en mesure de payer les factures de sa famille et de prendre soin des enfants. Ici, le "programmeur", "mari" et "père" sont des interfaces, et une personne est un objet qui les met en œuvre. Notez que les interfaces n'implique pas la présence de toutes les fonctionnalités spécifiques (champs) pour la mise en œuvre de l'objet, juste les actions que cet objet doit être en mesure d'effectuer.
Java suit plus ou moins cette idée, mais comme tout paradigme de la mise en œuvre a ses caractéristiques propres. Java permet de décrire les méthodes, c'est des actions que la mise en œuvre de l'objet doit être en mesure d'effectuer, mais pas tous les détails de mise en œuvre, donc, rien au sujet de l'objet de champs ou de méthodes privées.
Mais qu' constantes (
public final static
champs)? Font-ils partie de la mise en œuvre ou de l'interface. Il pourrait être à la fois. E. g. l'interface de "programmeur" peut avoir les constantesWORK_HOURS
réglé sur "8". Ainsi, Java permet de décrire les constantes dans les interfaces trop.Noter que Java que vous aide à faire de la bonne conception de la programmation orientée objet, mais il n'est pas fortement besoin. En particulier, toutes les méthodes publiques d'un objet doit exister dans l'interface de trop. Par exemple, les méthodes getter et setter sont normalement public, mais en fait ils sont la le cadre de la mise en œuvre, pas d'interface, et donc il vaut la peine de ne pas l'aborder dans l'interface.
(Il est aussi à noter que la plupart des choses que j'ai décrites ici sont sur le courant dominant de la programmation orientée objet, comme en Java, mais il existe également d'autres types de programmation orientée objet, comme le prototype de base, en particulier implémenté en JavaScript).
Si cette interface se réfère à des constantes? Ne serait-il pas naturel de les déclarer dans l'interface?
Oui, vous pouvez avoir des champs constants dans les interfaces, mais vous avez raison quand vous dites que "il semble que contrairement à ce qu'une interface est censé faire", car il n'est pas une bonne pratique. Pourquoi voudriez-vous d'avoir tous vos classes qui implémentent une interface avec les mêmes constantes? Vous pouvez tout simplement dans la classe qui l'utilise, ou si vous avez vraiment besoin de les exporter en quelque sorte, de les avoir dans une classe séparée utiliy comme ceci:
Vous avez également des enums, si vous avez besoin de représenter un ensemble de champs constants avec une certaine signification. Je ne vois pas de "cas d'utilisation", où vous réellement besoin des constantes dans une interface. Mais peut-être tort 🙂