Java Enum gibt Int zurück

Lesezeit: 7 Minuten

Benutzer-Avatar
Christian

Ich habe Probleme beim Deklarieren einer Aufzählung. Was ich versuche zu erstellen, ist eine Aufzählung für einen „DownloadType“, bei dem es 3 Download-Typen gibt (AUDIO, VIDEO, AUDIO_AND_VIDEO).

Ich habe den Code wie folgt implementiert:

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

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

Das funktioniert gut, wenn ich es dann so verwende:

DownloadType.AUDIO_AND_VIDEO.value;

Ich möchte es jedoch, damit ich nicht nach dem “Wert” fragen muss. Ich kann mich irren, aber so funktionieren mehrere Klassen in Java, z. B. Font, um beispielsweise einen Schriftstil festzulegen, den Sie verwenden:

Font.PLAIN

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

Font.PLAIN.value

  • Sie können auch einfach DownloadType.AUDIO_AND_VIDEO verwenden, es sei denn, Sie benötigen einen Wert. Übersehe ich etwas?

    – kosa

    9. Dezember 2012 um 21:37 Uhr

  • @Nambari Wenn ich System.out.println (DownloadType.AUDIO_AND_VIDEO) verwende, wird “AUDIO_AND_VIDEO” zurückgegeben, das anscheinend vom Typ “DownloadType” ist, nicht int.

    – Christian

    9. Dezember 2012 um 21:38 Uhr


  • Ich denke, Sie verwirren den Zweck von Aufzählungen. Warum brauchen Sie auch die ganze Zahl?

    – Jivings

    9. Dezember 2012 um 21:39 Uhr

  • Weil ich dachte, wenn ich dann den Typ bekommen möchte, könnte ich ‘if (downloadType == DownloadType.AUDIO){}’ verwenden, ist das nicht richtig?

    – Christian

    9. Dezember 2012 um 21:40 Uhr

  • Es ist das toString() Methode, die aufgerufen wird, wenn Sie Ihr Objekt drucken. Ebenfalls, SCHMUCKLOS ist eine Konstante in Font Klasse, keine Aufzählung.

    – Andreas Logwinow

    9. Dezember 2012 um 21:40 Uhr

Benutzer-Avatar
kennytm

Schriftart.PLAIN ist nicht eine Aufzählung. Es ist nur ein int. Wenn Sie den Wert aus einer Enumeration nehmen müssen, kommen Sie nicht umhin, eine Methode aufzurufen oder eine zu verwenden .valueweil Aufzählungen eigentlich Objekte ihres eigenen Typs sind, keine Primitiven.

Wenn Sie wirklich nur eine brauchen int, und Sie müssen bereits akzeptieren, dass die Typsicherheit verloren geht, der Benutzer kann ungültige Werte an Ihre API übergeben, Sie kann Definieren Sie diese Konstanten als int Auch:

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

    // If you have only static members and want to simulate a static
    // class in Java, then you can make the constructor private.
    private DownloadType() {}
}

Übrigens die value Feld ist eigentlich überflüssig, weil es auch ein gibt .ordinal() Methode, so dass Sie die definieren könnten enum wie:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

und erhalten Sie den “Wert” mit

DownloadType.AUDIO_AND_VIDEO.ordinal()

Bearbeiten: Code korrigiert.. static class ist in Java nicht erlaubt. Siehe diese SO-Antwort mit Erläuterungen und Details zum Definieren statischer Klassen in Java.

  • Danke für die Klarstellung, das ergibt jetzt Sinn. Anstatt eine Aufzählung zu erstellen, mache ich einen öffentlichen DownloadType { private static final int AUDIO = 0; } … Soll dies eine InnerClass sein? Danke für deine Antwort.

    – Christian

    9. Dezember 2012 um 21:43 Uhr

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

    – kennytm

    9. Dezember 2012 um 21:45 Uhr

  • Vielen Dank für Ihre Antworten, das war genau das, wonach ich gesucht habe – 3 Minuten warten, um es zu akzeptieren

    – Christian

    9. Dezember 2012 um 21:46 Uhr


  • Meinten Sie public static final int AUDIO = 0;. Soweit ich weiss const ist kein gültiges Java-Schlüsselwort.

    – Jade

    12. September 2013 um 18:28 Uhr

  • ordinal kann zu einem weniger stabilen System führen

    – hychu

    26. Juli 2017 um 14:33 Uhr

Benutzer-Avatar
PermGenError

Wenn Sie den int-Wert erhalten müssen, haben Sie einfach einen Getter für den Wert in Ihrer 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 die verwenden ordinal() -Methode, die die Position der Aufzählungskonstante in der Aufzählung zurückgeben würde.

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

  • Warum brauchen Sie eine zusätzliche Methode, wenn Sie einfach .value aufrufen können und es bereits eine Methode ordinal() gibt, um integer zu erhalten.

    – kosa

    9. Dezember 2012 um 21:40 Uhr


  • @Nambari ähm, ich weiß nicht, dass Enum eine Ordnungszahl hat. Wie dumm von mir: P

    – PermGenError

    9. Dezember 2012 um 21:41 Uhr

  • @GanGnaMStYleOverFlowErroR Danke für die Antwort, aber ich wollte eigentlich vermeiden, .value aufzurufen, geschweige denn eine andere Methode zu erstellen und getValue() aufzurufen 🙂

    – Christian

    9. Dezember 2012 um 21:44 Uhr

  • @GanGnaMStYleOverFlowErroR: Das ist richtig, das hätte ich in meinem Kommentar klarstellen können.

    – kosa

    9. Dezember 2012 um 21:45 Uhr

  • @Nambari no problomo, danke, dass du mich über ordinal() informiert hast 🙂 🙂

    – PermGenError

    9. Dezember 2012 um 21:48 Uhr

Benutzer-Avatar
Freude

Zunächst sollten Sie sich folgende Frage stellen: Brauchst du wirklich ein int?

Der Zweck von Aufzählungen besteht darin, eine Sammlung von Elementen (Konstanten) zu haben, die im Code eine Bedeutung haben, ohne sich auf einen externen Wert (wie ein Int) zu verlassen. Enums in Java können als Argument für switch-Anweisungen verwendet werden und sie können sicher mit dem Gleichheitsoperator “==” (unter anderem) verglichen werden.

Vorschlag 1 (kein int benötigt) :

Da braucht man oft keine Ganzzahl dahinter, dann nimm einfach das hier:

private enum DownloadType{
    AUDIO, VIDEO, AUDIO_AND_VIDEO
}

Verwendungszweck:

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 benötigt) :

Trotzdem kann es manchmal sinnvoll sein, eine Aufzählung in eine Ganzzahl umzuwandeln (z. B. wenn eine externe API Int-Werte erwartet). In diesem Fall würde ich raten, die Methoden als Konvertierungsmethoden mit dem zu markieren toXxx()-Stil. Zum Drucken überschreiben toString().

private enum DownloadType {
    AUDIO(2), VIDEO(5), AUDIO_AND_VIDEO(11);
    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.toInt());           //returns 2
System.out.println(DownloadType.AUDIO);                   //returns 2 via `toString/code`
System.out.println(DownloadType.AUDIO.ordinal());         //returns 0
System.out.println(DownloadType.AUDIO.name());            //returns AUDIO
System.out.println(DownloadType.VIDEO.toInt());           //returns 5
System.out.println(DownloadType.VIDEO.ordinal());         //returns 1
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 11

Zusammenfassung

  • Verwenden Sie eine Ganzzahl nicht zusammen mit einer Aufzählung, wenn Sie nicht müssen.
  • Verlassen Sie sich nicht auf die Verwendung ordinal() um eine Ganzzahl einer Aufzählung zu erhalten, da sich dieser Wert ändern kann, wenn Sie die Reihenfolge ändern (z. B. durch Einfügen eines Werts). Wenn Sie erwägen, zu verwenden ordinal() Es könnte besser sein, Vorschlag 1 zu verwenden.
  • Verwenden Sie normalerweise keine int-Konstanten anstelle von Aufzählungen (wie in der akzeptierten Antwort), da Sie die Typsicherheit verlieren.

  • +1 für den Hinweis auf die toString() obwohl das int zu einem String wird und ich es deswegen nicht verwenden werde 🙂

    – António Almeida

    8. Juni 2017 um 17:44 Uhr

Benutzer-Avatar
Oscar López

Einfach anrufen ordinal() -Methode für einen Aufzählungswert, um die entsprechende Nummer abzurufen. Es ist nicht erforderlich, ein Additionsattribut mit seinem Wert zu deklarieren, jeder Aufzählungswert erhält standardmäßig seine eigene Nummer, die bei Null beginnt und für jeden Wert in der gleichen Reihenfolge, in der sie deklariert wurden, um eins erhöht wird.

Darauf sollte man sich nicht verlassen int Wert eines enum, nur auf seinen tatsächlichen Wert. Enums in Java sind eine andere Art von Monster und nicht wie Enums in C, wo Sie von ihrem Integer-Code abhängig sind.

In Bezug auf das Beispiel, das Sie in der Frage angegeben haben, Font.PLAIN funktioniert, weil das nur eine ganzzahlige Konstante der Font-Klasse ist. Wenn Sie unbedingt einen (evtl. wechselnden) Zahlencode benötigen, dann an enum nicht das richtige Werkzeug für den Job ist, bleiben Sie besser bei numerischen Konstanten.

Sie können diesen Code ausprobieren.

private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}

Sie können diese Aufzählung wie folgt verwenden: DownloadType.AUDIO.ordinal(). Ich hoffe, dieses Code-Snippet wird Ihnen helfen.

Wenn Sie die Aufzählung mit einer Zeichenfolge verketten, können Sie die toString-Methode überschreiben, um den int zurückzugeben:

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

Dann könnten Sie einfach verwenden:

String something = "foo" + DownloadType.AUDIO;

und die Methode toString() wird aufgerufen.

Beachten Sie, dass die programmgesteuerte Verwendung von toString() im Allgemeinen als schlechte Übung angesehen wird – sie ist nur für menschliche Augen gedacht, dies ist jedoch die einzige Möglichkeit, das zu erreichen, was Sie verlangen.

Benutzer-Avatar
Hadrien01

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());
}

1225620cookie-checkJava Enum gibt Int zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy