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.

5voto

gerardw Punkte 5059

Das verwende ich. Ich behaupte nicht, dass es weit weniger "effizient" ist als die oben genannten einfacheren Lösungen. Was es tut, ist eine viel klarere Ausnahmemeldung als "ArrayIndexOutOfBounds", wenn ein ungültiger Ordinalwert in der obigen Lösung verwendet wird.

Es nutzt die Tatsache, dass EnumSet javadoc spezifiziert der Iterator gibt Elemente in ihrer natürlichen Reihenfolge. Es gibt eine Assert, wenn das nicht korrekt ist.

Der JUnit4-Test zeigt, wie er verwendet wird.

 /**
 * convert ordinal to Enum
 * @param clzz may not be null
 * @param ordinal
 * @return e with e.ordinal( ) == ordinal
 * @throws IllegalArgumentException if ordinal out of range
 */
public static <E extends Enum<E> > E lookupEnum(Class<E> clzz, int ordinal) {
    EnumSet<E> set = EnumSet.allOf(clzz);
    if (ordinal < set.size()) {
        Iterator<E> iter = set.iterator();
        for (int i = 0; i < ordinal; i++) {
            iter.next();
        }
        E rval = iter.next();
        assert(rval.ordinal() == ordinal);
        return rval;
    }
    throw new IllegalArgumentException("Invalid value " + ordinal + " for " + clzz.getName( ) + ", must be < " + set.size());
}

@Test
public void lookupTest( ) {
    java.util.concurrent.TimeUnit tu = lookupEnum(TimeUnit.class, 3);
    System.out.println(tu);
}

4voto

Westy92 Punkte 14901

Sicherheit geht vor (mit Kotlin):

// Default to null
EnumName.values().getOrNull(ordinal)

// Default to a value
EnumName.values().getOrElse(ordinal) { EnumName.MyValue }

1voto

Someone Somewhere Punkte 22958

Das mache ich auf Android mit Proguard:

public enum SomeStatus {
    UNINITIALIZED, STATUS_1, RESERVED_1, STATUS_2, RESERVED_2, STATUS_3;//do not change order

    private static SomeStatus[] values = null;
    public static SomeStatus fromInteger(int i) {
        if(SomeStatus.values == null) {
            SomeStatus.values = SomeStatus.values();
        }
        if (i < 0) return SomeStatus.values[0];
        if (i >= SomeStatus.values.length) return SomeStatus.values[0];
        return SomeStatus.values[i];
    }
}

es ist kurz und ich muss mich nicht um eine Ausnahme in Proguard kümmern

1voto

Amir Fo Punkte 3901

Sie können eine einfache Methode definieren wie:

public enum Alphabet{
    A,B,C,D;

    public static Alphabet get(int index){
        return Alphabet.values()[index];
    }
}

Und verwenden Sie es wie:

System.out.println(Alphabet.get(2));

0voto

Ar maj Punkte 1744
public enum Suit implements java.io.Serializable, Comparable<Suit>{
  spades, hearts, diamonds, clubs;
  private static final Suit [] lookup  = Suit.values();
  public Suit fromOrdinal(int ordinal) {
    if(ordinal< 1 || ordinal> 3) return null;
    return lookup[value-1];
  }
}

die Testklasse

public class MainTest {
    public static void main(String[] args) {
        Suit d3 = Suit.diamonds;
        Suit d3Test = Suit.fromOrdinal(2);
        if(d3.equals(d3Test)){
            System.out.println("Susses");
        }else System.out.println("Fails");
    }
}

Ich schätze es, dass Sie mit uns teilen, wenn Sie einen effizienteren Code haben, Mein enum ist riesig und ständig Tausende von Malen aufgerufen.

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