2010-10-14 10 views
9

Pour éviter les nombres magiques, j'utilise toujours des constantes dans mon code. Dans l'ancien temps nous avions l'habitude de définir des ensembles constants dans une interface sans méthode qui est maintenant devenue un antipattern.Meilleure pratique pour les constantes globales impliquant des nombres magiques

Je me demandais quelles sont les meilleures pratiques? Je parle de constantes globales. Une énumération est-elle le meilleur choix pour stocker des constantes dans Java?

Répondre

1

L'utilisation d'interfaces pour stocker des constantes est une sorte d'interface abusive. Mais l'utilisation d'Enums n'est pas le meilleur moyen pour chaque situation. Souvent, une simple int ou toute autre constante est suffisante. Définition propres instances de classe (« typées énumérations ») sont encore plus flexibles, par exemple:

public abstract class MyConst { 
    public static final MyConst FOO = new MyConst("foo") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    public static final MyConst BAR = new MyConst("bar") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    protected abstract void doSomething(); 

    private final String id; 

    private MyConst(String id) { 
    this.id = id; 
    } 

    public String toString() { 
    return id; 
    } 
    ... 
} 
+0

Comment est-il plus flexible que l'énumération? ils peuvent aussi avoir des méthodes spécifiques à la constante (méthodes abstraites que chaque constante individuelle implémente). –

4

Oui c'est. Enum est le meilleur choix.

Vous obtenez gratuitement:

  • constantes
  • objets immuables
  • des singletons

Tout en un.

Mais attendez, il y en a d'autres. Chaque valeur enum peut avoir ses propres champs et méthodes. C'est un objet constant riche avec un comportement qui permet la transformation en différentes formes. Non seulement à String, mais àInt, àWhateverDestination dont vous avez besoin.

+3

Et voici un guide sur la façon d'utiliser Enums comme constantes http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html – Joel

2

Enum est le meilleur pour la plupart des cas, mais pas tout. Certains pourraient être mieux placés comme avant, c'est-à-dire dans une classe spéciale avec des constantes statiques publiques.

Exemple où enum n'est pas la meilleure solution pour les constantes mathématiques, comme PI. Créer une énumération pour cela va aggraver le code.

enum MathConstants { 
    PI(3.14); 

    double a;   

    MathConstants(double a) { 
     this.a = a; 
    } 

    double getValueA() { 
     return a; 
    } 
} 

Utilisation:

MathConstants.PI.getValueA(); 

laid est-ce pas? Comparer à:

MathConstants.PI; 
29

Pour connaître les numéros magiques où le nombre réel a un sens et est non seulement une étiquette vous devriez évidemment pas utiliser énumérations. Alors le style ancien est toujours le meilleur.

public static final int PAGE_SIZE = 300; 

Lorsque vous étiquetez quelque chose, vous utilisez une énumération.

enum Drink_Size 
{ 
    TALL, 
    GRANDE, 
    VENTI; 
} 

Parfois, il est logique de mettre toutes vos constantes globales dans leur propre classe, mais je préfère les mettre dans la classe qu'ils sont le plus étroitement liés à. Ce n'est pas toujours facile à déterminer, mais en fin de compte, le plus important est que votre code fonctionne :)

+1

Belle distinction propre ici pour quand chacun est mieux utilisé – Brian

0

Oubliez les enums - maintenant, quand l'importation statique est disponible en Java, mettez toutes vos constantes dans REAL class (au lieu de l'interface), puis importez simplement les membres statiques de tous les autres en utilisant import static <Package or Class>.

+0

Pouvez-vous clarifier pourquoi nous devrions, "oublier d'énumérer" et expliquer pourquoi vous voulez importer les constantes d'autres classes statiquement? – allingeek

+0

1. La question portait sur les nombres magiques. Les énumérations ne sont pas bonnes pour les nombres comparés aux constantes standard - voir la réponse de @nanda ci-dessus. 2. En outre, les énumérations sont une décision laide lorsque vous devez stocker un ensemble de constantes de type différent. 3. Les énumérations ont été initialement introduites comme un conteneur pour _series_ d'éléments. Ce qui signifie que l'énumération décrit un ensemble logique d'unités: les mois, les jours de la semaine, les planètes, les couleurs de l'arc-en-ciel, etc. et une solution de contournement consistait à utiliser des énumérations pour les constantes afin d'éviter l'anti-pattern des «constantes d'interface». Maintenant, ce n'est plus nécessaire - nous avons des importations statiques à la place. –