2015-07-07 10 views
5

Ich verwende Aufzählung mit Schalter Fall aber ich die folgende Fehlermeldung erhalten:keine Konstante in Enum

NEWS FEED is not a constant in FragmentName

Dies ist meine Enum String-Konstante,

public enum FragmentName{ 
     FRAGMENT_NEWSFEED("NEWS FEED"), 
     FRAGMENT_MESSAGES("MESSAGES"), 
     FRAGMENT_EVENTS("EVENTS"), 
     FRAGMENT_WHOISAROUDNME("WHOS AROUND"); 

     private final String text; 
     private FragmentName(final String text) { 
      this.text = text; 
     } 
     @Override 
     public String toString() { 
      return text; 
     } 
    } 

//This is my function from where i check for corresponding enum constant 

public void changeTitle(String title) { 
     switch (Enums_String.FragmentName.valueOf(title)) { 
      case FRAGMENT_NEWSFEED: 
       System.out.println("1"); 
       break; 
      case FRAGMENT_EVENTS: 
       System.out.println("2"); 
       break; 
      case FRAGMENT_MESSAGES: 
       System.out.println("3"); 
       break; 
      case FRAGMENT_WHOISAROUDNME: 
       System.out.println("4"); 
       break; 
     } 
    } 

Als ich

nennen
 changeTitle("NEWS FEED"); 

es erstellt eine Ausnahme in der ChangeTitle-Funktion auch der Wert übergeben ist gleich, so würde jede Hilfe als I ha geschätzt werden Ich habe alles versucht, um das zu lösen.

+2

Der 'valueOf' Aufruf erwartet, dass Sie einen Wert wie' FRAGMENT_NEWSFEED' übergeben, nicht den Stringwert 'NEWS FEED'. – sstan

+0

Was erwarten Sie, wenn Sie 'Enums_String.FragmentName.valueOf (title)' aufrufen, wobei 'title'' 'NEWS FEED '' ist und warum Sie denken, dass es so funktionieren sollte (welcher Teil der Dokumentation schlägt dies vor?) arbeiten, wie Sie denken, dass es tut)? – Pshemo

+0

danke sstan, aber ich möchte 'NEWS FEED' an changeTitle (String) Methode und entsprechende senden, muss es funktionieren – TheGreat004

Antwort

7

Fügen Sie diesen Code auf Ihre Enum

private static final Map<String, FragmentName> map = new HashMap<>(); 
static { 
    for (FragmentName en : values()) { 
     map.put(en.text, en); 
    } 
} 

public static FragmentName valueFor(String name) { 
    return map.get(name); 
} 

Jetzt statt valueOf Verwendung valueFor

switch (Enums_String.FragmentName.valueFor(title)) 
//        ^^^^^^^^ 
2

eine Methode wie folgt erstellen:

public static FragmentName getFragmentNameByText(String text) { 
    for (FragmentName fragment : values()) { 
     if (fragment.text.equals(text)) { 
     return fragment; 
     } 
    } 
    return null; 
} 

und nennen dies statt valueOf().

+0

danke Christopeh Schutz, es hat funktioniert – TheGreat004

+0

Kein Problem, wieso kennst du meine Antwort dann nicht als angenommene Antwort? Was auch immer viel Glück :) –

+0

gut ich weiß nicht für Flagge, aber jetzt hatte ich getan, und danke – TheGreat004

3

Die valueOf

Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.

Was möchten Sie tun id ENUM von einem Mitglied erhalten Wert dafür haben Sie eine Funktion wiezu schreibenunter

public enum FragmentName { 

    FRAGMENT_NEWSFEED("NEWS FEED"), 
    FRAGMENT_MESSAGES("MESSAGES"), 
    FRAGMENT_EVENTS("EVENTS"), 
    FRAGMENT_WHOISAROUDNME("WHOS AROUND"); 

    private final String text; 

    private FragmentName(final String text) { 
     this.text = text; 
    } 

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

    public static FragmentName fromString(String value) { 
     for (FragmentName fname : values()) { 
      if (fname.text.equals(value)) { 
       return fname; 
      } 
     } 
     return null; 
    } 
} 

und Ihre Schaltergehäuse ersetzen wie

switch (FragmentName.fromString(title)) { 
0

Sie Ihre Funktion in den String-Werte vergleichen ändern geben:

public void changeTitle(String title) { 
     if(title.equals(FRAGMENT_NEWSFEED.toString())) { 
      System.out.println("1"); 
     } else if(title.equals(FRAGMENT_MESSAGES.toString())) { 
      System.out.println("2"); 
     } else if(title.equals(FRAGMENT_EVENTS.toString())) { 
      System.out.println("3"); 
     } else if(title.equals(FRAGMENT_WHOISAROUDNME.toString())) { 
      System.out.println("4"); 
     } else { 
      // throw an error 
     } 
    } 

Sie nicht aus einem Schalter arbeiten können eines Funktionsaufrufs, also müssen Sie einen if-else-Block verwenden.

Verwandte Themen