2015-07-07 13 views
5

używam wyliczenie z przypadku przełącznika ale otrzymuję następujący błąd:nie stała w Enum

NEWS FEED is not a constant in FragmentName

To jest mój enum ciąg stały,

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

Kiedy zadzwonić

 changeTitle("NEWS FEED"); 

tworzy wyjątek w funkcji changeTitle nawet wartość przekazana jest taka sama, więc każda pomoc byłaby doceniana, ponieważ ja ha próbowałem wszelkich starań, aby rozwiązać ten problem.

+2

Wywołanie "valueOf" oczekuje, że przekażesz wartość typu 'FRAGMENT_NEWSFEED', a nie wartość ciągu' NEWS FEED'. – sstan

+0

Czego oczekujesz po wywołaniu 'Enums_String.FragmentName.valueOf (title)' z 'title' jest' "NEWS FEED" 'i dlaczego uważasz, że to powinno działać w ten sposób (która część dokumentacji sugeruje ci, że powinno to pracować tak, jak myślisz, że to robi)? – Pshemo

+0

dziękuję sstan, ale chcę, aby "WIADOMOŚĆ NEWS" wysyłana do metody changeTitle (String) i odpowiednia, musi działać – TheGreat004

Odpowiedz

7

Dodaj ten kod do wyliczenia

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

Teraz zamiast valueOf użycie valueFor

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

Tworzenie metody takie jak to:

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

i nazywają to zamiast valueOf().

+0

dzięki Christopeh Schutz, zadziałało – TheGreat004

+0

Nie ma problemu, dlaczego więc nie oznaczasz mojej odpowiedzi jako zaakceptowanej odpowiedzi? Cokolwiek powodzenia :) –

+0

cóż, nie wiem na flagę, ale teraz zrobiłem i dziękuję – TheGreat004

3

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.

Co chcesz zrobić id uzyskać enum przez członka wartość dla tego, że napisałeś funkcję, aby to zrobić jak fromString poniżej

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

i zastąpić sprawa przełącznik jak

switch (FragmentName.fromString(title)) { 
0

Można zmienić funkcję porównać wartości ciągów przekazywanych w:

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

Nie można stosować wyłączania wywołania funkcji, więc musisz użyć bloku if-else.