2014-09-24 8 views
15

Ich habe oft die Situation, wo ich eine Variable für eine Klasse benötigen, die so einfach Enum-Typen, beispielsweise dargestellt werden könnte:Java Enum Overkill?

private enum PageOrder {DOWN_THEN_OVER, OVER_THEN_DOWN}; 

Wenn ein declare den Enum-Typ innerhalb der Klasse, die die Variable dann hält Ich habe den qualifizierten Namen MyClass.PageOrder zu verwenden, der nicht bequem ist. Aber wenn ich eine neue Klasse erstellen, habe ich eine Klasse für eine einfache enum-Deklaration, die für mich übertrieben erscheint.

Aus diesem Grund verwende ich häufig Ganzzahlen anstelle von Aufzählungstyp.

Alle Kommentare/Vorschläge zu diesem Thema?

+26

Niemals die richtige Lösung auf eine falsche "korrigieren", nur um Tipparbeit zu sparen. – biziclop

+1

"* Aber wenn ich eine neue Klasse erstelle, habe ich eine Klasse für eine einfache Enum-Deklaration, die für mich übertrieben erscheint *" - wo ist der Overkill? Ein privates Enum ist ebenfalls eine Klasse (mit einer eigenen .class-Datei) - es hat nur eine andere Sichtbarkeit. –

+5

Ein Enum in seiner eigenen Datei mag wie Overkill erscheinen, aber es ist nicht. Es ist völlig angemessen und es ist gutes Design. Fügen Sie der Enum-Klasse und jeder ihrer Konstanten ein nützliches Javadoc hinzu, und Sie werden feststellen, dass die Quelldatei nicht annähernd so dünn aussieht. Es gibt legitime Verwendungen für innere Klassen, aber etwas zu einer inneren Klasse zu machen, nur weil seine eigene Datei "zu schwer" wäre, ist kein guter Grund. – VGR

Antwort

34

Sie können seit inner enums are always static Das wird immer funktionieren

import static yourpkg.MyClass.PageOrder; 

tun. Beachten Sie, dass dies sogar in der Datei funktioniert, die die Klasse MyClass definiert.

+4

Und Sie können Eclipse so konfigurieren, dass statische Importe automatisch eingefügt werden. – biziclop

+2

Yup. Wie [hier] erklärt (http: // stackoverflow.com/questions/288861/eclipse-optimize-imports-to-include-static-imports). – aioobe

+1

Enums vermeiden Mehrdeutigkeit oder einfach kryptischen Code. 'renderPage (1)' ist nicht so aussagekräftig wie 'renderPage (OVER_THEN_DOWN)'. – sfdcfox

21

Aus diesem Grund verwende ich häufig Ganzzahlen anstelle von Enum-Typ.

Bitte tun Sie das nicht.

Sie können oft einen Namen für die Elternklasse und die enum, die tatsächlich hilft die Klarheit des Codes.

class Page { 
    enum Order { 
     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 
} 

// Accessing: A little verbose but clear and efficient. 
Page.Order order = Page.Order.DOWN_THEN_OVER; 

Sie können static import auch jede enum Sie verwenden, aber ich ziehe die oben Ausführlichkeit.

import static com.oldcurmudgeon.test.Test.Order.DOWN_THEN_OVER; 
import static com.oldcurmudgeon.test.Test.Order.OVER_THEN_DOWN; 

public class Test { 

    enum Order { 

     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 

    public void test() { 
     Order pageOrder = DOWN_THEN_OVER; 
    } 

} 

Natürlich kann man diesen Ansatz nicht einnehmen, wenn die enumprivate ist.

+1

Die Alternative zu enum ist die Verwendung von 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; 'und es scheint mir, dass beide für kleine Werte gleich lesbar und wartbar sind. –

+0

int DOWN_THEN_OVER = 1; int OVER_THEN_DOWN = 1; int wackyDuck = 1;/* DOWN_THAN_OVER gespeichert als int könnte das gleiche wie OVER_THAN_DOWN oder nur eine verrückte Ente sein */ –

+2

@JohnHenkel - 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; ... public statisch final int UP_THEN_AT_THEM = 92367; '-' turnPage (UP_THEN_AT_THEM) '- Siehst du die Gefahr jetzt? Mit einem 'enum' kann man das einfach nicht - auch nicht aus Versehen. – OldCurmudgeon

-2

Wenn Sie Enums nur verwenden, um den Zahlen coderfreundliche Namen zu geben, und Sie sie nie auf den Bildschirm schreiben oder aus einer Datei lesen müssen, dann ist das alles ein Overkill. Unglückliches Artefakt der Tatsache, dass alles in Java eine Klasse sein muss. Wenn Sie die Enums verwenden, empfehle ich stattdessen die Verwendung von Konstanten.

Wenn Sie den Wert der Aufzählung im benutzerfreundlichen Format drucken oder einen Wert in eine Aufzählung umwandeln möchten, benötigen Sie wahrscheinlich die Klasse.