2009-12-07 6 views
8

Pourquoi est-ce qu'une variable utilisée dans une interface est PUBLIC STATIC FINAL? Pourquoi "statique" en particulier? Parce que vous ne pouvez pas instancier une interface.Variables dans l'interface

+0

J'ai lu dans un livre il ya un certain temps qu'il est préférable de faire une variable d'une interface comme myInterface myVarible = new myInterface(); que d'utiliser une classe parce qu'il est plus facile de maintenir la route. Comment cela serait-il le cas? –

+0

Copie possible de [Pourquoi les variables d'interface sont-elles statiques et définitives par défaut?] (Http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – Line

Répondre

20

Un champ déclaré dans une interface ne peut être qu'une constante, alors pourquoi dépend-il de l'instance que vous utilisez pour y accéder?

Mettre des champs dans les interfaces est souvent de mauvaise qualité de toute façon de nos jours. L'interface est destinée à refléter les capacités des classes qui l'implémentent - ce qui est complètement orthogonal à l'idée d'une constante. C'est certainement une mauvaise idée d'utiliser une interface juste pour déclarer un tas de constantes. Je trouve parfois utile de faire en sorte que le type d'interface expose des constantes qui sont des implémentations simples - ainsi une interface de filtrage peut avoir des champs "ALLOW_ALL" et "ALLOW_NONE", par exemple.

Je suppose que vous pourriez concevoir d'un scénario dans lequel la mise en œuvre d'une interface ne ajouter en fait un champ d'instance de votre classe - mais qui briserait l'encapsulation non seulement en termes de celui-ci étant implicitement public, mais aussi en spécifiant une partie de l'implémentation au lieu de l'API.

+3

De nos jours, les paramètres de constantes statiques sont globalement mauvais, en remplaçant le groupe de constantes par Enums est actuellement la bonne façon Java, car il est extrêmement sécurisé, fonctionne avec des commutateurs et peut être codé pour inclure plusieurs valeurs utiles en évitant les répétitions. nombres magiques. – Esko

+0

@Jon Skeet Génial .. Mais je ne l'ai pas implémenté pratiquement! – Sandeep

+0

@Esko: Les énumérations sont appropriées dans * certains * cas, mais elles ne couvrent certainement pas * tous les cas où vous voudriez des constantes. En particulier, les énumérations ne sont appropriées que s'il existe un ensemble de valeurs fixe. Par exemple, il serait bien d'avoir Charset "constantes" pour UTF-8 et les autres charsets garantis - mais vous ne voudriez pas en faire une énumération. N'essayez pas de tout faire ressembler à un clou juste parce que vous avez le marteau enum :) –

6

De plus, il ne peut pas y avoir de corps de méthode pour utiliser une variable non-finale non-statique.

3

Pourquoi ne serait-ce pas statique?

C'est une constante associée à l'interface, plutôt qu'à une instance particulière de celle-ci.

+0

abstract class peut avoir une instance? – UnKnown

3

La principale raison pour laquelle je suppose est le détail de l'implémentation de la VM/langue.

Si une interface n'est pas autorisée à avoir des variables non statiques, il n'est pas nécessaire d'allouer de la mémoire pour l'interface lors de la création de la classe. Il n'y a pas non plus besoin de mécanismes spéciaux de nommage/renommage au cas où vous héritez de variables avec le même nom. La seule chose dont vous avez besoin est une table pour appeler les fonctions correctes lorsque l'interface est utilisée. En bref, cela simplifie la vie du responsable de la langue/de la machine virtuelle. Si vous voulez vraiment jeter un coup d'oeil à l'héritage multiple et à ses pièges et pièges, lisez Object Oriented Software Construction de Bertrand Meyer (2ème édition). Vous comprenez alors pourquoi l'interface doit être si simple (et pourtant archive la plupart des choses que l'héritage multiple fait).

2

Une interface est un contrat qui définit l'interaction entre les objets.

Cette interaction est définie par les méthodes exposées, et non par les variables. Les variables ne décriraient que le fonctionnement interne, pas l'interaction.

Notez que les variables ne doivent jamais être utilisées pour l'interaction. Selon le principe OOP encapsulation, il serait un crime de laisser 1 classe accéder directement à une variable d'une autre classe.

Les constantes (par exemple Math.PI) sont la seule exception acceptable. Puisque constantes sont le seul type de variables qui peuvent être accessibles directement par d'autres classes sans violer le principe de l'encapsulation, toutes les variables dans une interface sont traitées comme public static final variables (c.-à-d.constantes)