2015-07-07 18 views
5

Sto usando enumerazione con il caso di interruttore, ma sto ottenendo il seguente errore:non è una costante in Enum

NEWS FEED is not a constant in FragmentName

Questa è la mia stringa enum costante,

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; 
     } 
    } 

Quando chiamo

 changeTitle("NEWS FEED"); 

crea un'eccezione nella funzione changeTitle anche il valore passato è lo stesso, quindi qualsiasi aiuto sarebbe apprezzato come ho Ho provato ogni mio sforzo per risolvere questo.

+2

La chiamata 'valueOf' si aspetta che tu passi un valore come' FRAGMENT_NEWSFEED', non il valore stringa 'NEWS FEED'. – sstan

+0

Cosa ti aspetti che succeda quando chiami 'Enums_String.FragmentName.valueOf (title)' con 'title' come' "NEWS FEED" 'e perché pensi che dovrebbe funzionare in questo modo (quale parte della documentazione ti suggerisce che questo dovrebbe funziona come pensi che lo faccia)? – Pshemo

+0

grazie sstan, ma voglio "NEWS FEED" da inviare al metodo changeTitle (String) e corrispondente, deve funzionare – TheGreat004

risposta

7

Aggiungere il codice al tuo 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); 
} 

Ora, invece di valueOf uso valueFor

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

Creare un metodo come questo:

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

e chiamare questo invece di valueOf().

+0

grazie Christopeh Schutz, ha funzionato – TheGreat004

+0

Nessun problema, perché non si contrassegna la mia risposta come risposta accettata allora? Qualunque buona fortuna :) –

+0

beh non lo so per la bandiera, ma ora avevo fatto, e grazie – TheGreat004

3

Il 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.

Che cosa si vuole fare id ottenere l'enum da un membro valore per cui hai scritto una funzione per farlo come fromString sotto

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; 
    } 
} 

e sostituire il vostro caso interruttore come

switch (FragmentName.fromString(title)) { 
0

È possibile modificare la funzione per confrontare i valori di stringa passati in:

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 
     } 
    } 

Non è possibile utilizzare un interruttore off di una chiamata di funzione, quindi è necessario utilizzare un blocco if-else.