2010-10-14 9 views
9

Um magische Zahlen zu vermeiden, verwende ich immer Konstanten in meinem Code. Früher haben wir konstante Mengen in einer methodenlosen Schnittstelle definiert, die jetzt zu einem Antipattern geworden ist.Bewährte Methode für globale Konstanten mit magischen Zahlen

Ich habe mich gefragt, was sind die besten Praktiken? Ich spreche von globalen Konstanten. Ist eine enum die beste Wahl für das Speichern von Konstanten in Java?

Antwort

1

Verwenden von Schnittstellen zum Speichern von Konstanten ist eine Art von Missbrauch Schnittstellen.

Aber Enums ist nicht der beste Weg für jede Situation. Oft genügt eine einfache int oder was auch immer Konstante. Definieren von eigenen Klasseninstanzen („typsichere Aufzählungen“) sind noch flexibler, zum Beispiel:

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

Wie ist es flexibler als enums? sie können auch konstant-spezifische Methoden haben (abstrakte Methoden, die jede einzelne Konstante implementiert). –

4

Ja ist es. Enum ist die beste Wahl.

Sie kostenlos bekommen:

  • Konstanten
  • unveränderliche Objekte
  • Singletons

in einem.

Aber warten Sie, es gibt noch mehr. Jeder Enum-Wert kann eigene Felder und Methoden haben. Es ist ein reiches konstantes Objekt mit einem Verhalten, das eine Transformation in verschiedene Formen ermöglicht. Nicht nur toString, sondern toInt wasauchimmer Sie brauchen.

+3

Und hier ist eine Anleitung zur Verwendung von Enums als Konstanten http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html – Joel

2

Enum ist am besten für die meisten Fälle, aber nicht alles. Einige könnten besser wie vorher sein, das ist in einer speziellen Klasse mit öffentlichen statischen Konstanten.

Beispiel wo Enum nicht die beste Lösung ist für mathematische Konstanten, wie PI. Wenn Sie eine Enum erstellen, wird der Code schlechter.

enum MathConstants { 
    PI(3.14); 

    double a;   

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

    double getValueA() { 
     return a; 
    } 
} 

Verbrauch:

MathConstants.PI.getValueA(); 

hässlich ist es nicht? Vergleichen mit:

MathConstants.PI; 
29

Für magische Zahlen, wo die Zahl eine Bedeutung tatsächlich hat und ist nicht nur ein Label, das Sie offensichtlich nicht Aufzählungen verwenden sollte. Dann ist der alte Stil immer noch der Beste.

public static final int PAGE_SIZE = 300; 

Wenn Sie nur etwas etikettieren, würden Sie eine Enum verwenden.

enum Drink_Size 
{ 
    TALL, 
    GRANDE, 
    VENTI; 
} 

Manchmal macht es Sinn, alles in ihrer eigenen Klasse Ihrer globalen Konstanten zu setzen, aber ich ziehe sie in der Klasse zu setzen, dass sie am ehesten gebunden. Das ist nicht immer einfach zu bestimmen, aber am Ende des Tages ist die wichtigste Sache, dass Ihr Code funktioniert :)

+1

Nice clean distinction hier für, wenn jeder am besten verwendet wird – Brian

0

Vergessen Sie Enums - jetzt, wenn der statische Import in Java verfügbar ist, setzen Sie alle Ihre Konstanten in REAL Klasse (anstelle der Schnittstelle) und dann importieren Sie einfach die statischen Mitglieder von allen anderen mit import static <Package or Class>.

+0

Können Sie erklären, warum wir sollten "vergessen Enums" und erarbeiten, warum Sie die Konstanten aus anderen Klassen statisch importieren möchten? – allingeek

+0

1. Die Frage war über magische Zahlen. Aufzählungen sind nicht gut für Zahlen im Vergleich zu Standardkonstanten - siehe oben die Antwort von @nanda. 2. Darüber hinaus sind Aufzählungen eine hässliche Entscheidung, wenn Sie eine Menge von Konstanten unterschiedlichen Typs speichern müssen. 3. Enums wurden ursprünglich als Container für _Series_ von Elementen eingeführt. Das bedeutet, dass die Aufzählung eine logische Menge von Einheiten beschreibt: Monate, Wochentage, Planeten, Regenbogenfarben usw .; und es war ein Workaround, Enums für Konstanten zu verwenden, um das Anti-Pattern der "Schnittstellenkonstanten" zu vermeiden. Jetzt ist es nicht mehr erforderlich - wir haben stattdessen statische Importe. –

Verwandte Themen