2013-05-23 4 views
9

Ich lese Effective Java von Joshua Bloch im Jahr 2008 veröffentlicht, und ein Tipp ist es, Enum Konstrukte mit Klassen zu ersetzen. Hier ist das Beispiel aus dem Buch.Ersetzt Enum-Konstrukte mit Klassen in Java noch relevant?

Meine Frage ist, da Java jetzt Enum-Typ unterstützt, ist es immer noch eine gute Idee, den obigen Ansatz zu verwenden? Hier ist ein Beispiel für den Java-Enum-Typ.

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 
+0

Enums in Java sind Klassen. – FDinoff

+0

Für grundlegende enum-ähnliche Funktionalität gibt es keinen Grund, keine einfachen 'Enum's zu verwenden. Es gibt ein paar fortgeschrittene kleine Verbesserungen, die Sie nicht mit Enums machen können, wo das typsichere Enum-Muster noch angewendet werden kann. –

+0

Lesen Sie die zweite Ausgabe des Buches, es lohnt sich wirklich, weil es die neuen Java-Funktionen abdeckt. –

Antwort

10

Das Buch „Effective Java“ gut in die Sprache vor der Einführung von enum s geschrieben wurde, ich würde so empfehlen stattdessen mit der enum Funktion. Glücklicherweise sind die Java enum s sehr vielseitig, so kann man ziemlich genau Joshuas Rat folgt die enum-Funktion:

public enum Day { 
    SUNDAY("Sunday", 0) 
, MONDAY("Monday", 1) 
, TUESDAY("Tuesday", 2) 
, WEDNESDAY("Wednesday", 3) 
, THURSDAY("Thursday", 4) 
, FRIDAY("Friday", 5) 
, SATURDAY("Saturday", 6); 

    private String name; 
    private int ordinal; 
    public String getName() { return name; } 
    public int getOrdinal() { return ordinal; } 
    public Day(String name, int ordinal) { 
     this.name = name; 
     this.ordinal = ordinal; 
    } 
} 
+0

EnumSets sind auch ein ziemlich nützliches Konstrukt. – wmorrison365

+6

Es ist erwähnenswert, dass die zweite Ausgabe die Verwendung von Enums umfasst. – Jonathan

+0

Dank dasblinkenlight, Ihr Beispiel ist sehr nützlich. – beyonddc

2

Ich denke, dass die Idee, genau entgegengesetzt ist. Wenn Sie eine enumähnliche Struktur haben, verwenden Sie enum.

Ihr Klassenbeispiel passt nicht genau zu dem Enum, das Sie geschrieben haben. Erstens kann es nicht kompiliert werden, da es mehrere Felder mit dem Namen CLUBS enthält. Zweitens enthält enum Tage, die in Ihrer Klasse nicht erwähnt werden.

+0

oops! Du hast meinen Tippfehler entdeckt. – beyonddc

0

Soweit ich weiß, kompiliert Java enum-s zu Objekte. Sie können dies überprüfen, indem Sie enum .class-Dateien mit javap (http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html) anzeigen.

+0

Das stimmt, aber das beantwortet die Frage nicht wirklich. –

+0

Es zeigt, dass beide Ansätze gleichwertig sind. – mrak

+0

nur, wenn der Quellcode keine Rolle spielt, und ich würde sagen, die Quelle ist sehr wichtig. –