2016-06-22 9 views
2

Angenommen, ich habe eine Enum wie folgt aus:Neuen Enum-Wert zur Laufzeit

public enum BlaEnum{ 
    BLA1, 
    BLA2; 

    private static final String BLA_ONE = "bla one"; 
    private static final String BLA_TWO = "bla two"; 

    public static String getName(BlaEnum bla) { 
     switch(bla) { 
      case BLA1: return BLA_ONE; 
      case BLA2: return BLA_TWO; 
      default: return null; 
     } 
    } 

    public static BlaEnum getBla(String bla) { 
     switch(naam) { 
      case BLA_ONE: return BLA1; 
      case BLA_TWO: return BLA2; 
      default: //return new enum value via reflection; 
     } 
    } 
} 

Wie kann ich je nach eingehenden String, geben einen neuen Enum-Wert zur Laufzeit? Als ob es würde ein zusätzlicher Wert erklärt:

public enum BlaEnum { 
    BLA1, BLA2, EXTRA_BLA 
... 
} 
+2

Warum möchten Sie das tun? Sie können nicht. * –

+0

Verwenden Sie einfach eine reguläre Klasse. –

+0

* Schauen Sie sich [this] (http://stackoverflow.com/a/534177/438154) an, wenn Sie selbstzerstörerisch sind. –

Antwort

2

Sie können nicht. Enums are constant.

Wenn Sie in einen Fall geraten sind, in dem Sie zur Laufzeit einen neuen Enum-Wert zurückgeben müssen, sollten Sie Ihr Design ernsthaft überdenken. Was Sie wahrscheinlich brauchen, ist eine tatsächliche Klasse oder vielleicht ein Catchall-Enum-Wert wie "andere".

+0

Danke! Deshalb konnte ich die Antwort nicht finden :). –

2

Sie können dies mit einer Enum nicht tun. Wie es in JLS Sec 8.9 heißt:

Ein Enum-Typ hat keine anderen Instanzen als die durch seine Enum-Konstanten definiert.

Sie können jedoch eine Schnittstelle definieren:

interface SomeInterface { 
    // Add methods as required. 
} 

Und haben Ihre Enum diese Schnittstelle implementieren:

enum BlaEnum implements SomeInterface { 
    BLA1, BLA2; 
} 

Neben einer konkreten Klasse der Umsetzung der Schnittstelle:

class SomeInterfaceImpl implements SomeInterface { 
    // ... whatever body 
} 

Und haben Sie Ihre getBla(String) Methode Erstellen Sie eine Instanz von SomeInterfaceImpl I N der Standardfall, z.

default: 
    return new SomeInterfaceImpl(bla); 

(Natürlich wäre der Rückgabetyp müssen SomeInterface sein, anstatt BlaEnum).

Sie können auch eine Art Memo verwenden, wenn dieselbe Instanz von SomeInterfaceImpl zurückgegeben werden soll, wenn die Methode mehrmals mit demselben Parameter aufgerufen wird.

+0

Ich kann diese Methode nicht verwenden, da mein Wert in Hibernate einem Enum (@Enumerated) zugeordnet ist. Ich muss diesen Teil neu gestalten, da manchmal eine unbekannte Entität von Bla eingefügt werden kann ... –

+0

@Valentin sicher sein, alle relevanten Details in deine Frage einzuschließen. –

+0

eigentlich fragte ich was ich wissen wollte. Du hast mir das gerade gesagt, also bin ich froh, dass ich meine Frage so gestellt habe :). –