2016-08-28 2 views
3

Warum verursacht der folgende Code eine Ausnahme?Ändern der Enum-Werte

Ich muss Enum-Werte beibehalten, und ich rate die Best Practice für die Persistenz der Enum-Werte in der Datenbank ist es, sie als Kleinbuchstaben-Literale und damit diesen Aufwand zu speichern.

public enum Type { 

SWIPE_BUTTON("swipe_button"), DROP_DOWN("drop_down"), RADIO_BUTTON("radio_button"), CHECK_BOX("check_box"); 

private final String label; 

private Type (String label) { 
    this.label = label; 
} 

public String getValue() { 
    return label; 
} 

@Override 
public String toString() { 
    return getValue(); 
} 

public static Type getEnum (String value) { 

    for (Type type : values()) 
     if (type.getValue().equals(value)) return type; 

    throw new IllegalArgumentException("invalid value for type"); 
} 

public static void main (String[] args) { 

    System.out.println(Type.valueOf("swipe_button")); 
} 
} 

Ich fand diesen Ansatz here.

UPDATE

Sieht aus wie ich im Wesentlichen die valueOf Methode außer Kraft zu setzen versuchte, und die Antwort ist es nicht möglich ist, dies zu tun. Ich habe versucht, diese Methode zu überschreiben, so dass, wenn mein JPA-Datenbank-Mapper versucht, das Entitätsobjekt aus der Datenbank automatisch zu füllen, ich die kleineren String-Literale (in der Datenbank) in ihre oberen enum-Konstanten konvertieren kann. Ich werde erwidern, die Enums mit ihren eigenen Namen (d. H. Großbuchstaben) fortzuführen.

+1

Da gibt es keine Typ-Instanz namens "swipe_button" '. Es gibt jedoch eine namens "SWIPE_BUTTON". –

+0

Warum sollten Sie 'getEnum' definieren, wenn Sie es nicht nennen? –

+0

sollte es sein 'Type.valueOf (" SWIPE_BUTTON ")' – NageN

Antwort

2

muss ich Enum-Werte bestehen bleiben, und ich bin zu raten, die

keine Notwendigkeit für diese komplexen Ansatz ...

stattdessen so etwas wie

public enum Type { 

SWIPE_BUTTON, DROP_DOWN, RADIO_BUTTON, CHECK_BOX; 
} 

tun und den Namen des bekommen Konstanten im Enumerator (das ist, was Sie am Ende brauchen ...)

Speichern Sie die Type.name() statt ...

+0

wäre das Kleinbuchstabe oder noch in der Datenbank großgeschrieben? –

+0

es wäre das gleiche wie sie in der enum definiert sind ... name ist ein String also wenn Kleinbuchstaben erforderlich ist, können Sie tun *** Type.name(). ToLowerCase() *** –

+0

Eine andere Komplexität ist, dass meine Kunden in die DB als Lower Cased schreiben und wenn ich versuche, automatisch zu füllen Das Entitätsobjekt verwendet den MongoDB-Mapper von Spring, der direkt den 'Enum.valueOf' verwendet. –

1

Enum.valueOf arbeitet mit dem Namen, es funktioniert nicht mit der Zeichenfolge, die Sie zugewiesen, so sollten Sie Type.valueOf("SWIPE_BUTTON") verwenden, da der Name Großbuchstaben ist.

Wahrscheinlich meintest du Type.getEnum("swipe_button").

1

Wenn Sie die möglichen Aufzählungskonstanten iterieren, wie

for (Type t : values()) { 
    System.out.println("t name:" + t. name()); 

Sie werden feststellen, dass Aufzählungen auf ihren Namen gebaut werden.

Denken Sie daran: Gebäude Enums von Strings muss für alle Arten von Enums arbeiten. Daher basiert der gesamte Mechanismus auf einer festen Eigenschaft jeder Enum-Konstante - und das wäre ... nun, sein Name.

Also: wenn Sie diese magische "valueOf()" Methode verwenden möchten; dann musst du den Regeln folgen, die diese Methode und die Magie dahinter verwenden.