2008-12-14 13 views
10

in Java < 1.5 würde Konstanten wie dieseSollten Sie immer Aufzählungen anstelle von Konstanten in Java verwenden

public class MyClass { 
    public static int VERTICAL = 0; 
    public static int HORIZONTAL = 1; 

    private int orientation; 

    public MyClass(int orientation) { 
     this.orientation = orientation; 
    } 
... 

umgesetzt werden und man würde es wie folgt verwenden:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

nun in 1,5 Natürlich sollten Sie Enums verwenden:

public class MyClass { 
    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

und jetzt würden Sie es wie folgt verwenden:

MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL); 

Was ich leicht hässlich finde. Jetzt konnte ich einfach ein paar statische Variablen hinzufügen:

public class MyClass { 
    public static Orientation VERTICAL = Orientation.VERTICAL; 
    public static Orientation HORIZONTAL = Orientation.HORIZONTAL; 

    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

Und jetzt kann ich das wieder tun:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

Mit all der typsichere Güte Aufzählungen.

Ist das ein guter Stil, schlechter Stil oder keiner von beiden. Können Sie sich eine bessere Lösung vorstellen?

aktualisieren

Vilx- war der erste, zu markieren, was ich fühle ich fehlte -, dass der ENUM ein Bürger erster Klasse sein sollte. In Java bedeutet dies, dass es eine eigene Datei im Paket erhält - wir haben keine Namespaces. Ich hatte gedacht, dass das ein bisschen Schwergewicht sein würde, aber tatsächlich getan, es fühlt sich definitiv richtig an.

Yuval's Antwort ist in Ordnung, aber es betonte nicht wirklich die nicht verschachtelte Enum. Auch für 1.4 - es gibt viele Stellen im JDK, die Ganzzahlen verwenden, und ich war wirklich auf der Suche nach einer Möglichkeit, diese Art von Code zu entwickeln.

+0

Im ersten Codeblock wollten Sie jeder Variablen einen anderen Wert geben, oder? –

+0

Brauchen Sie tatsächlich die Klasse MyClass, um mehr zu tun als nur die verschiedenen Orientierungen? –

Antwort

2

Ich weiß nichts über Java, aber in .NET empfiehlt es sich, Enums parallel zu der Klasse zu setzen, die sie verwendet, auch wenn sie nur von einer Klasse verwendet wird. Das heißt, würden Sie schreiben:

namespace Whatever 
{ 
    enum MyEnum 
    { 
    } 
    class MyClass 
    { 
    } 
} 

So können Sie verwenden:

MyClass c = new MyClass(MyEnum.MyValue); 
5

Wußten Sie, Sie Ausrichtung importieren können und sagen

MyClass myClass = new MyClass(Orientation.VERTICAL); 

?

+0

Guter Punkt. Ja, habe ich, aber das bedeutet noch mehr Ausführlichkeit im aufrufenden Code (es fügt eine Import-Zeile hinzu). Meine Motivation ist es, die Vorwahl kürzer und sauberer zu halten. – Draemon

+0

Es tut mir leid, Mann. Ich meine, ich liebe Java und alles, aber _shorter_ war nie eine Priorität in dieser Sprache. –

+3

Kürzer? Was zum ... also statt einer Importzeile lieber MyClass immer wieder schreiben? Das ist weder kürzer noch sauberer für mich. – arul

0

Es hängt davon ab, wie viele Werte der Enum nehmen. In Ihrem Beispiel, mit nur zwei, würde ich nur einen booleschen verwenden. Wenn die Enumeration nur von Code verwendet wird, den Sie schreiben, und nicht mit viel anderem Code interagieren muss, benötigen Sie möglicherweise keine Typsicherheit. Aber wenn es sich um eine "öffentliche" Methode handelt, würde ich definitiv Enums wählen und das Enum in eine eigene Datei legen.

+0

Sie haben einen Punkt, aber mit enum ist ein bisschen selbstbeschreibender dann nur ein boolean. –

+0

Aber wenn Sie es nur in eine Funktion übergeben, können Sie die Signatur 'public MyClass (boolean isVertical)' erstellen. Das ist ungefähr der einzige Fall, in dem ich es benutzen würde. –

27

Sie kompliziert es zu viel. Lass uns alles zusammenbringen.

Beitrag Java 1.5 sollten Sie die Java Enum-Klasse verwenden:

public enum Color 
{ 
    BLACK, WHITE; 
} 

Pre Java 1.5 sollten Sie das typsichere Enum-Muster verwenden:

public class Color 
{ 
    public static Color WHITE = new Color("white"); 
    public static Color BLACK = new Color("black"); 

    private String color; 

    private Color(String s) 
    { 
     color = s; 
    } 
} 

In beiden Möglichkeiten, wie Sie es wie so nennen:

drawBackground(Color.WHITE); 

Insbesondere in Bezug auf Ihre Frage. Es ist eine Frage des Codestils, aber ich denke, der bevorzugte Weg besteht darin, Enums in ihren separaten Klassen zu behalten. Vor allem, wenn sie ihre eigenen Methoden wie getName(), getId(), etc ... bekommen, denken Sie daran, dass es das gleiche Dilemma ist wie normale Klasse gegen anonyme Klasse. Sobald die Klasse überfüllt ist, ist es an der Zeit, sie auf ihre eigene Ebene zu verschieben Datei.

0

Sie können auch zwei statische Methoden auf MyClass haben:

MyClass.Vertical() : MyClass 
MyClass.Horizontal() : MyClass 

Diese wird eine neue Instanz mit dem richtigen Enum-Set zurückzukehren.

0

Ich stimme zu, dass Sie kreativ waren, aber ich denke, es ist keine praktische Lösung und ich denke, Sie haben die "Hässlichkeit" einfach auf einen anderen Teil des Codes verschoben. Was passiert, wenn Sie neben VERTIKAL und HORIZONTAL auch DIAGONAL, AA, BB, CC usw. haben? Müssen Sie durch die Eingabe jeder einzelnen statischen Konstante duplizieren? Ihr Geschmack, dass MyClass.Orientation.VERTICAL hässlich ist, könnte persönlich sein?

+0

Ich stimme zu, dass ich gerade die Hässlichkeit verschoben habe, aber ich bevorzuge es immer etwas in genanntem Code zu sein, im Gegensatz zu Anrufcode. Es ist absolut persönlich und ich bin mir nicht einmal sicher, ob mir die Alternative gefällt, weshalb ich nach Perspektiven frage. Ich komme zu dem Schluss, dass eine separate Klasse am besten wäre. – Draemon

0

Es gibt eine wichtige Klasse von Fällen, in denen Sie anstelle von enum s Konstanten verwenden sollten. Dies ist der Fall, wenn Sie mit den Konstanten arithmetisch arbeiten oder sie mit numerischen Werten vergleichen möchten. Dann brauchen Sie wirklich das Ding, um ein int, long oder double zu sein.

Umgekehrt, wenn es nie sinnvoll wäre, arithmetische oder numerische Vergleiche mit einem Ding zu machen, sollte dieses Ding eher ein Objekt als ein primitives numerisches sein, also wäre enum geeigneter.

Verwandte Themen