147 votes

Qu'est-ce que l'utilisation de l'interface constantes?

Je suis en train d'apprendre Java et juste trouvé que l'Interface peut avoir des champs, qui sont public static et final. Je n'ai pas vu des exemples de ces jusqu'ici. Quels sont les cas d'utilisation de l'Interface de ces Constantes et je peux voir des Java Standard de la Bibliothèque?

227voto

Pascal Thivent Points 295221

Mettre les membres statiques dans une interface et de l'implémentation de cette interface) est une mauvaise pratique et il y a même un nom pour elle, la Constante de l'Interface Antipattern, voir Efficace Java, Point 17:

La constante de l'interface modèle est une mauvaise utilisation des interfaces. Qu'une classe utilise certaines constantes en interne est un détail d'implémentation. La mise en œuvre d'une constante de l'interface sont les causes de cette mise en œuvre détail de la fuite dans la classe de l'API exportées. Il est sans conséquence pour les utilisateurs d'une classe que la classe implémente une constante de l'interface. En fait, on pourrait les confondre. Pire, il représente un engagement: si dans une version future de la classe est modifiée de sorte qu'elle n'a plus besoin d'utiliser les constantes, il doit encore mettre en œuvre l'interface de garantir la compatibilité binaire. Si un nonfinal classe implémente une constante de l'interface, l'ensemble de ses sous-classes ont leurs espaces de noms pollué par les constantes de l'interface.

Il y a plusieurs constante des interfaces dans la plate-forme java bibliothèques, comme java.io.ObjectStreamConstants. Ces interfaces doivent être considérés comme des anomalies et ne doit pas être imité.

Pour éviter les écueils de la constante d'interface (parce que vous ne pouvez pas empêcher les gens de le mettre en œuvre), une classe avec un constructeur privé devrait être préféré (exemple emprunté à Wikipédia):

public final class Constants {

private Constants() {
    // restrict instantiation
}

public static final double PI = 3.14159;
public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

Et pour accéder à l'une des constantes sans avoir à obtenir d'eux (c'est à dire sans avoir à préfixer avec le nom de la classe), l'utilisation d'une statique à l'importation (depuis Java 5):

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}

6voto

stacker Points 34209

Joshua Bloch, "Effective Java - Langage De Programmation Guide":

"La constante de l'interface modèle est une mauvaise utilisation des interfaces. Qu'une classe utilise certaines constantes en interne est un détail d'implémentation. La mise en œuvre d'une constante de l'interface sont les causes de cette mise en œuvre détail de la fuite dans la classe de l'API exportées. Il est sans conséquence pour les utilisateurs d'une classe que la classe implémente une constante de l'interface. En fait, on pourrait les confondre. Pire, il représente un engagement: si dans une version future de la classe est modifiée de sorte qu'elle n'a plus besoin d'utiliser les constantes, il doit encore mettre en œuvre l'interface de garantir la compatibilité binaire. Si un nonfinal classe implémente une constante de l'interface, l'ensemble de ses sous-classes ont leurs espaces de noms pollué par les constantes de l'interface."

3voto

dcp Points 26928

Ils sont utiles si vous avez des constantes communes qui seront utilisés dans les classes qui implémentent l'interface.

Voici un exemple: http://www.javapractices.com/topic/TopicAction.do?Id=32

Mais notez que la pratique recommandée consiste à utiliser des importations au lieu de constantes dans les interfaces. Voici une référence: http://www.javapractices.com/topic/TopicAction.do?Id=195

1voto

Progman Points 2244

L' javax.swing.SwingConstants interface est un exemple qui a obtenu les champs statiques qui sont utilisés entre le swing des classes. Ceci vous permet de facilement utiliser quelque chose comme

  • this.add(LINE_START, swingcomponent);
  • this.add(this.LINE_START, swingcomponent); ou
  • this.add(SwingComponents.LINE_START, swingcomponent);

Cependant, cette interface n'est pas des méthodes...

-2voto

Jinju Joseph Points 1029

les champs doivent être déclarées dans une interface de sorte qu'ils sont plus faciles à partager et peut être référencé sans l'introduction supplémentaire de couplage.

Source De: Développeur Java Outils De Style De Codage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X