2012-12-09 14 views
54

Ich habe Probleme beim Deklarieren einer Enum. Was ich versuche zu erstellen, ist ein Enum für einen 'DownloadType', wo es 3 Download-Typen gibt (AUDIO, VIDEO, AUDIO_AND_VIDEO).Java Enum Rückkehr Int

Ich habe den Code wie folgt umgesetzt:

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 
} 

Dies funktioniert gut, wenn ich es dann wie folgt verwenden:

jedoch
DownloadType.AUDIO_AND_VIDEO.value; 

, ich mag es würde, so dass ich nicht habe um den "Wert" zu bitten. Ich kann falsch sein, aber das ist die Art und Weise mehr Klassen wie Schriftart in Java arbeiten, zum Beispiel eines Schriftstil einstellen, die Sie verwenden:

Font.PLAIN 

, die einen int-Wert zurückgibt, wissen wir nicht verwenden:

Font.PLAIN.value 
+1

Sie können einfach Downloadart verwenden.AUDIO_AND_VIDEO auch, wenn Sie Wert brauchen, fehlt mir etwas? – kosa

+0

@Nambari Wenn ich System.out.println (DownloadType.AUDIO_AND_VIDEO) gibt es "AUDIO_AND_VIDEO" zurück, das anscheinend vom Typ 'DownloadType' ist, nicht int. – Cristian

+2

Ich denke, du verwirrst den Zweck von Enums. Warum brauchst du auch die ganze Zahl? – Jivings

Antwort

86

Font.PLAIN ist nicht eine Enumeration. Es ist nur ein int. Wenn Sie den Wert aus einer Enumeration herausnehmen müssen, können Sie nicht vermeiden, eine Methode aufzurufen oder .value zu verwenden, da Enums tatsächlich Objekte eines eigenen Typs sind, keine Primitive.

Wenn Sie wirklich brauchen nur ein int, und Sie sind bereits entschieden, dass Art-Sicherheit akzeptieren, den Benutzer verloren ungültige Werte zu Ihrem API übergeben können, Sie können diese Konstanten als int definieren auch:

static class DownloadType { 
    public static final int AUDIO = 0; 
    public static final int VIDEO = 1; 
    public static final int AUDIO_AND_VIDEO = 2; 
} 

By the way, das value Feld ist eigentlich überflüssig, denn es gibt auch eine .ordinal() Methode ist, so könnten Sie definieren die enum als:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO } 

und erhalten den „Wert“ mit

DownloadType.AUDIO_AND_VIDEO.ordinal() 
+0

Vielen Dank für die Klarstellung, das macht jetzt Sinn. Anstatt eine Enumeration zu erstellen, mache ich einen öffentlichen DownloadType {private static final int AUDIO = 0; } ... Sollte das eine InnerClass sein? Danke für deine Antwort. – Cristian

+0

@Cristian: Es hängt hauptsächlich davon ab, wie Sie darauf zugreifen möchten. – kennytm

+0

Vielen Dank für Ihre Antworten, war genau das, was ich gesucht habe - 3 Minuten warten, um zu akzeptieren – Cristian

38

Wenn Sie den int-Wert erhalten müssen, haben nur einen Getter für den Wert in Ihrem ENUM:

private enum DownloadType { 
    AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

public static void main(String[] args) { 
    System.out.println(DownloadType.AUDIO.getValue());   //returns 1 
    System.out.println(DownloadType.VIDEO.getValue());   //returns 2 
    System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3 
} 

Oder Sie könnten einfach Verwendung der ordinal() Methode, die die Position des Enum zurückkehren co nstant in der enum.

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    //rest of the code 
} 

System.out.println(DownloadType.AUDIO.ordinal());   //returns 0 
System.out.println(DownloadType.VIDEO.ordinal());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2 
+2

Warum brauchen Sie zusätzliche Methode, wenn Sie einfach aufrufen können. Wert und es ist bereits eine Methode ordinal() bereitgestellt, um Ganzzahl zu erhalten. – kosa

+0

@Nambari umm, dint know Enum hat ordinal .. wie dumm von mir: P – PermGenError

+0

@GanGnaMStYleOverFlowErroR Danke für die Antwort, aber ich wollte eigentlich vermeiden zu rufen .value, geschweige denn Erstellen einer anderen Methode und Aufruf von getValue() :) – Cristian

10

einfach die ordinal() Methode auf einem ENUM-Wert nennen, seine entsprechende Nummer abzurufen. Es besteht keine Notwendigkeit, ein Additionsattribut mit seinem Wert zu deklarieren, jeder Aufzählungswert erhält standardmäßig eine eigene Nummer, die von Null an zugewiesen wird und für jeden Wert in der Reihenfolge, in der sie deklariert wurden, um eins erhöht wird.

Sie sollten nicht auf den int Wert eines enum, nur auf seinen tatsächlichen Wert abhängen. Enums in Java sind eine andere Art von Monster und sind nicht wie Enums in C, wo Sie auf ihren ganzzahligen Code angewiesen sind.

In Bezug auf das Beispiel, das Sie in der Frage angegeben haben, funktioniert Font.PLAIN, weil das nur eine Ganzzahlkonstante der Font-Klasse ist.Wenn Sie unbedingt einen (eventuell ändernden) numerischen Code benötigen, dann ist ein enum nicht das richtige Werkzeug für den Job, besser bei numerischen Konstanten bleiben.

+1

Ich bin mir der ordinal() bewusst, aber wenn ich später eine andere Reihenfolge ändern oder angeben möchte, wird dies Probleme verursachen. Ich möchte den int-Wert – Cristian

+1

@Cristian angeben Sie sollten nicht auf den int-Wert einer Aufzählung, nur auf seinen tatsächlichen Wert abhängen. Enums in Java sind nicht wie Enums in C, wo Sie auf ihren Integer-Code angewiesen sind. –

+0

@Cristian und bezüglich des Beispiels, das Sie in der Frage 'Font.PLAIN' angegeben haben, funktioniert das, weil das nur eine ganzzahlige Konstante der' Font' Klasse ist. Wenn Sie unbedingt einen (eventuell ändernden) numerischen Code benötigen, dann ist eine 'enum' nicht das richtige Werkzeug für den Job, halten Sie sich besser an numerische Konstanten. –

3

Wenn Sie die Enum mit einer Zeichenfolge verketten können Sie toString Methode überschreiben, die int zurückzukehren:

public String toString() { 
    return value + ""; 
} 

Dann könnte man einfach nutzen:

String something = "foo" + DownloadType.AUDIO; 

und die toString() -Methode aufgerufen werden.


Beachten Sie, dass die Verwendung von toString() programmatisch allgemein als schlechte Übung betrachtet wird - es ist nur für menschliche Augen gedacht, dies ist jedoch der einzige Weg, um das zu erreichen, was Sie fragen.

+0

Tolles Work-around, danke! – Cristian

10

Zuerst sollten Sie sich die folgende Frage stellen: Brauchen Sie wirklich ein int?

Der Zweck von enums ist es, eine Sammlung von Elementen (Konstanten) zu haben, die eine Bedeutung im Code haben, ohne auf einen externen Wert (wie ein int) angewiesen zu sein. Enums in Java können als Argument für Switch-Statements verwendet werden und können unter anderem mit dem Gleichheitsoperator "==" verglichen werden.

Vorschlag 1 (kein int erforderlich):

Oft gibt es keine Notwendigkeit für eine ganze Zahl dahinter.

private enum DownloadType{ 
    AUDIO, VIDEO, AUDIO_AND_VIDEO 
} 

//... 

DownloadType downloadType = MyObj.getDownloadType(); 
if (downloadType == DownloadType.AUDIO) { 
    //... 
} 
//or 
switch (downloadType) { 
    case AUDIO: //... 
      break; 
    case VIDEO: //... 
      break; 
    case AUDIO_AND_VIDEO: //... 
      break; 
} 

Vorschlag 2 (int erforderlich):

Trotzdem kann es manchmal sinnvoll sein, eine ENUM in einen int zu konvertieren (zum Beispiel, wenn eine externe API int Werte erwartet). In diesem Fall würde ich empfehlen, die Methoden als Konvertierungsmethoden mit dem toXxx()-Style zu markieren. Zum Drucken übersteuern toString().

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int code; 

    private DownloadType(int code) { 
     this.code = code; 
    } 

    public int toInt() { 
     return code; 
    } 

    public String toString() { 
     //only override toString, if the returned value has a meaning for the 
     //human viewing this value 
     return String.valueOf(code); 
    } 
} 

System.out.println(DownloadType.AUDIO);     //returns 0 
System.out.println(DownloadType.AUDIO.name());   //returns AUDIO 
System.out.println(DownloadType.VIDEO.toInt());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2 

Zusammenfassung

  • Sie einen Integer nicht mit einem ENUM verwenden zusammen, wenn Sie nicht haben.
  • Verlassen Sie sich nicht auf ordinal(), um eine Ganzzahl einer Aufzählung zu erhalten, da sich dieser Wert ändern kann, wenn Sie eine andere Aufzählungskonstante hinzufügen oder die Reihenfolge ändern.
  • Normalerweise verwenden Sie keine int-Konstanten anstelle von enums (wie in der akzeptierten Antwort), weil Sie die Typ-Sicherheit verlieren (wie @KennyTM erwähnt).
+0

+1 für das Zeigen der 'toString()', obwohl das int ein String wird und ich werde es deshalb nicht verwenden :) –

4

Sie können diesen Code versuchen.

private enum DownloadType { 
    AUDIO , VIDEO , AUDIO_AND_VIDEO ; 

} 

können Sie diese Enumeration verwenden, wie wie folgt aus: DownloadType.AUDIO.ordinal(). Ich hoffe, dass Ihnen dieses Code-Snippet hilft.

3

Möchten Sie diesen Code?

public static enum FieldIndex { 
    HDB_TRX_ID,  //TRX ID 
    HDB_SYS_ID  //SYSTEM ID 
} 

public String print(ArrayList<String> itemName){ 
    return itemName.get(FieldIndex.HDB_TRX_ID.ordinal()); 
}