369 Stimmen

Umwandlung von enum ordinal in enum type

Ich habe den Enum-Typ ReportTypeEnum die zwischen Methoden in allen meinen Klassen übergeben werden, aber ich muss diese dann auf die URL übergeben, so dass ich die Ordinal-Methode verwenden, um den int-Wert zu erhalten. Nachdem ich ihn in meiner anderen JSP-Seite erhalten habe, muss ich ihn wieder in eine ReportTypeEnum damit ich es weitergeben kann.

Wie kann ich die Ordnungszahl in die ReportTypeEnum ?

Verwendung von Java 6 SE.

735voto

Joachim Sauer Punkte 290477

Um eine Ordnungszahl in ihre Enum-Repräsentation umzuwandeln, können Sie dies tun:

ReportTypeEnum value = ReportTypeEnum.values()[ordinal];

Bitte beachten Sie die Array-Grenzen.

Beachten Sie, dass jeder Aufruf von values() gibt ein neu geklontes Array zurück, was sich negativ auf die Leistung auswirken kann. Sie sollten das Array zwischenspeichern, wenn es häufig aufgerufen werden soll.

Code-Beispiel für den Cache values() .


Diese Antwort wurde überarbeitet, um das in den Kommentaren gegebene Feedback zu berücksichtigen

145voto

oxbow_lakes Punkte 131223

Dies ist fast sicher eine schlechte Idee . Sicherlich, wenn die Ordnungszahl de-facto (z. B. weil jemand die URL mit einem Lesezeichen versehen hat) - das bedeutet, dass Sie immer die enum Ordnung in der Zukunft, was für die Code-Verwalter in der Folgezeit nicht offensichtlich sein mag.

Warum kodieren Sie nicht die enum mit myEnumValue.name() (und dekodieren über ReportTypeEnum.valueOf(s) ) stattdessen?

115voto

QED Punkte 9591

Wenn ich in Zukunft values() eine Menge:

enum Suit {
   Hearts, Diamonds, Spades, Clubs;
   public static final Suit values[] = values();
}

Währenddessen wo auch immer.java:

Suit suit = Suit.values[ordinal];

Wenn Sie wollen, dass das Feld privat bleibt, bitte sehr:

private static final Suit values[] = values();
public static Suit get(int ordinal) { return values[ordinal]; }

...

Suit suit = Suit.get(ordinal);

Achten Sie auf Ihre Array-Grenzen.

19voto

jmkelm08 Punkte 659

Ich stimme mit den meisten Leuten überein, dass die Verwendung von Ordinalzahlen wahrscheinlich eine schlechte Idee ist. Normalerweise löse ich dieses Problem, indem ich der Enum einen privaten Konstruktor gebe, der zum Beispiel einen DB-Wert annehmen kann und dann eine statische fromDbValue Funktion ähnlich der in Jans Antwort.

public enum ReportTypeEnum {
    R1(1),
    R2(2),
    R3(3),
    R4(4),
    R5(5),
    R6(6),
    R7(7),
    R8(8);

    private static Logger log = LoggerFactory.getLogger(ReportEnumType.class);  
    private static Map<Integer, ReportTypeEnum> lookup;
    private Integer dbValue;

    private ReportTypeEnum(Integer dbValue) {
        this.dbValue = dbValue;
    }

    static {
        try {
            ReportTypeEnum[] vals = ReportTypeEnum.values();
            lookup = new HashMap<Integer, ReportTypeEnum>(vals.length);

            for (ReportTypeEnum  rpt: vals)
                lookup.put(rpt.getDbValue(), rpt);
         }
         catch (Exception e) {
             // Careful, if any exception is thrown out of a static block, the class
             // won't be initialized
             log.error("Unexpected exception initializing " + ReportTypeEnum.class, e);
         }
    }

    public static ReportTypeEnum fromDbValue(Integer dbValue) {
        return lookup.get(dbValue);
    }

    public Integer getDbValue() {
        return this.dbValue;
    }

}

Jetzt können Sie die Reihenfolge ändern, ohne die Suche zu ändern und umgekehrt.

8voto

Jan Punkte 7911

Sie könnte eine statische Nachschlagetabelle verwenden:

public enum Suit {
  spades, hearts, diamonds, clubs;

  private static final Map<Integer, Suit> lookup = new HashMap<Integer, Suit>();

  static {
    int ordinal = 0;
    for (Suit suit : EnumSet.allOf(Suit.class)) {
      lookup.put(ordinal, suit);
      ordinal+= 1;
    }
  }

  public Suit fromOrdinal(int ordinal) {
    return lookup.get(ordinal);
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X